每日一练
给你一种规律 pattern 和一个字符串 s,请你判断 s 是否和 pattern 的规律相匹配。
如果存在单个字符到字符串的 双射映射 ,那么字符串 s 匹配 pattern ,即:如果pattern 中的每个字符都被它映射到的字符串替换,那么最终的字符串则为 s 。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。
示例 1:
输入:pattern = "abab", s = "redblueredblue"输出:true解释:一种可能的映射如下:'a' -> "red"'b' -> "blue"
示例 2:
输入:pattern = "aaaa", s = "asdasdasdasd"输出:true解释:一种可能的映射如下:'a' -> "asd"
示例 3:
输入:pattern = "aabb", s = "xyzabcxzyabc"输出:false
提示:
1 <= pattern.length, s.length <= 20pattern 和 s 由小写英文字母组成
解答:采用dfs分割子串
public class Day7 {
public static void main(String[] args) {
// String s = "abcabc";
// new Day7().solution("aa",s,0,0);
// new Day7().solution("abab","redblueredblue",0,0);
// new Day7().solution("abab","xyzabcxzyabc",0,0);
new Day7().solution("aaaa","asdasdasdasd",0,0);
System.out.println(flag);
}
ArrayList<String> list = new ArrayList<>();
static boolean flag = false;
//暴力切割成指定块,找到匹配的一次,若没有,那么返回false
public void solution(String s, String pattern, int start, int deep) {
if (flag) return;
if (deep == s.length() ) {//一一比对
for (int i = 0; i < s.length(); i++) {
for (int j = i + 1; j < s.length(); j++) {
if (s.charAt(i) == s.charAt(j)) {
if (list.get(i) != null && !list.get(i).equals(list.get(j))) {
return;
}
}
}
}
flag = true;
return;
}
for (int i = start; i < pattern.length() - s.length() + deep + 1; i++) {
if (deep == s.length() - 1){
list.add(pattern.substring(start).intern());
solution(s, pattern, i + 1, deep + 1);
list.remove(deep);
break;
}
list.add(pattern.substring(start, i + 1).intern());
solution(s, pattern, i + 1, deep + 1);
list.remove(deep);
}
}
}