题目描述
题目链接:290.单词规律
给定一种规律pattern
和一个字符串s
,判断s
是否遵循相同的规律。
这里的遵循
指完全匹配,例如,pattern
里的每个字母和字符串s
中的每个非空单词之间存在着双向连接的对应规律。
示例1
输入: pattern = “abba”, s = “dog cat cat dog”
输出: true
示例 2
输入:pattern = “abba”, s = “dog cat cat fish”
输出: false
示例 3
输入: pattern = “aaaa”, s = “dog cat cat dog”
输出: false
提示
- 1 <=
pattern.length
<= 300 pattern
只包含小写英文字母- 1 <=
s.length
<= 3000 s
只包含小写英文字母和' '
s
不包含 任何前导或尾随对空格s
中每个单词都被单个空格
分隔
解题核心
在规律中同样的字母是同一个规则,所以我们可以匹配当前使用的规则第一次出现的位置是不是一样的即可
解法一:位置匹配
先将两个字符串转换成数组,然后去匹配当前位置对应的元素第一次出现的位置是否相同
public boolean wordPattern(String pattern, String s) {
String[] patterns = pattern.split("");
String[] words = s.trim().split("\\s+");
if (patterns.length != words.length) {
return false;
}
for (int i = 0; i < patterns.length; i++) {
int index = -1;//记录首次出现的位置,每次循环都要重新初始化,否则存在数据不对应
//因为单词长度不确定,用s.indexOF()获取的是单词首字母的位置而不是单词的位置
for (int j = 0; j < words.length; j++) {
if (Objects.equals(words[j], words[i])) {
index = j;//找到第一次出现的位置
break;
}
}
if (pattern.indexOf(patterns[i]) != index) {//
return false;
}
}
return true;
}