[面试题 16.18. 模式匹配]
你有两个字符串,即pattern
和value
。 pattern
字符串由字母"a"
和"b"
组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"
匹配模式"aabab"
(其中"cat"
是"a"
,"go"
是"b"
),该字符串也匹配像"a"
、"ab"
和"b"
这样的模式。但需注意"a"
和"b"
不能同时表示相同的字符串。编写一个方法判断value
字符串是否匹配pattern
字符串。
示例 1:
输入: pattern = "abba", value = "dogcatcatdog"
输出: true
示例 2:
输入: pattern = "abba", value = "dogcatcatfish"
输出: false
示例 3:
输入: pattern = "aaaa", value = "dogcatcatdog"
输出: false
示例 4:
输入: pattern = "abba", value = "dogdogdogdog"
输出: true
解释: "a"="dogdog",b="",反之也符合规则
提示:
0 <= len(pattern) <= 1000
0 <= len(value) <= 1000
- 你可以假设
pattern
只包含字母"a"
和"b"
,value
仅包含小写字母。
思路:暴力枚举a和b可能的字符串,可以通过先匹配长度剪枝
package LeetCode;
/**
* @ClassName M16_8
* @Description TODO
* @Author m
* @Version 1.0
*/
public class M16_8 {
public boolean patternMatching(String pattern, String value) {
int num_a = 0;
int num_b = 0;
for (int i = 0; i < pattern.length(); i++) {
if(pattern.charAt(i) == 'a'){
num_a++;
}else {
num_b++;
}
}
if(value.length() == 0){
return (num_a*num_b == 0);
}
if(pattern.length() == 0){
return value=="";
}
if(num_a == 0) {
num_a = num_b;
}
if (num_b == 0){
num_b = num_a;
}
//枚举b字符串的长度,枚举a的也一样
for (int i = 0; i <= value.length()/num_b; i++) {
String sa = "";
String sb = "";
//a的总长
int lens = value.length() - i * num_b;
//如果平均a的长度不为整数,continue;
if (lens % num_a != 0) {
continue;
}
//a的长度
int lena = lens/num_a;
StringBuilder res = new StringBuilder();
for (int i1 = 0; i1 < pattern.length(); i1++) {
if (pattern.charAt(i1) == 'a') {
if(sa.equals("") && lena != 0){
sa = value.substring(res.length(),res.length()+lena);
}
res.append(sa);
} else {
if(sb.equals("") && i != 0){
sb = value.substring(res.length(),res.length()+i);
}
res.append(sb);
}
}
if (res.toString().equals(value)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
System.out.println(new M16_8().patternMatching("abba",
"dogcatcatdog"
));
}
}