所以我在编码挑战中遇到了这个问题,并且非常迷失。我需要编写一个函数,它接受一个模式并将其与输入相匹配。例如模式是 abba
输入为 bluegreengreenblue
。
在这种情况下,函数返回 true,因为输入与模式匹配。
如果输入是bluebluegreengreen
,答案将为假。对于相同的图案。
本质上我正在尝试编写一个函数,
boolean wordpattern(String pattern, string input){
//process input to match pattern
// return true if it matches
//return false if it doesn't
}
输入不一定是有意义的单词。可以是axcdefdeefdeaxcd
有人可以帮助我用算法来开始解决这个问题吗?我想不出任何方法来开始解决这个问题。
最佳答案
我建议生成一个正则表达式。然后将生成的正则表达式应用到您的文本中。
生成正则表达式时,对每个第一次出现的字符使用 (.+)
,然后使用 \1
、\2
引用它> 等
代码可能如下所示:
import java.util.*;
import java.util.regex.Pattern;
public class X {
public static void main(String[] args) {
wordpattern("abba", "bluegreengreenblue");
}
protected static boolean wordpattern(String pattern, String input) {
Map<Character,Integer> patternItemNumbers = new HashMap<>();
StringBuilder regularExpression = new StringBuilder();
int groupCount = 1;
for (char patternItem : pattern.toCharArray()) {
Integer group = patternItemNumbers.get(patternItem);
// first occurrence: create new fetching group
if (group == null) {
regularExpression.append("(.+)");
patternItemNumbers.put(patternItem, groupCount++);
}
// every next occurrence: reuse group by identifier
else {
regularExpression.append('\\');
regularExpression.append(group);
}
}
String regexp = regularExpression.toString();
boolean matches = Pattern.matches(regexp, input);
System.out.println("pattern: "+pattern);
System.out.println("regular expression: "+regexp);
System.out.println("matches: "+matches);
return matches;
}
}
它输出:
pattern: abba
regular expression: (.+)(.+)\2\1
matches: true
<小时/>
另一个例子:wordpattern("aaab", "bluebluebluegreen");
将输出:
pattern: aaab
regular expression: (.+)\1\1(.+)
matches: true
关于java - 在 Java 中将模式与输入进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35515617/