290.单词规律
给定一种规律 pattern
和一个字符串 str
,判断 str
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应规律。
示例1:
1 2
| 输入: pattern = "abba", str = "dog cat cat dog" 输出: true
|
示例 2:
1 2
| 输入:pattern = "abba", str = "dog cat cat fish" 输出: false
|
Solution
这道题显示是205 同构字符串
的升级版本,当然也可以用其解法,难点在与需要以空格来隔断字符串,并且用substring
函数来断开字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public boolean wordPattern(String pattern, String str) { Map<String, Character> str2ch = new HashMap<String, Character>(); Map<Character, String> ch2str = new HashMap<Character, String>(); int m = str.length(); int i = 0; for (int p = 0; p < pattern.length(); ++p) { char ch = pattern.charAt(p); if (i >= m) { return false; } int j = i; while (j < m && str.charAt(j) != ' ') { j++; } String tmp = str.substring(i, j); if (str2ch.containsKey(tmp) && str2ch.get(tmp) != ch) { return false; } if (ch2str.containsKey(ch) && !tmp.equals(ch2str.get(ch))) { return false; } str2ch.put(tmp, ch); ch2str.put(ch, tmp); i = j + 1; } return i >= m; } }
|
也正如205
一样,该题也有更为简单的办法,因为是以空格断开字符,直接用JAVA
中的split(" ")
就可以断开字符串了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public boolean wordPattern(String pattern, String str) { String[] words = str.split(" "); if (words.length != pattern.length()) { return false; } Map<Object, Integer> map = new HashMap<>(); for (Integer i = 0; i < words.length; i++) { if (map.put(pattern.charAt(i), i) != map.put(words[i], i)) { return false; } } return true; } }
|