1.題目
給定一種規律 pattern
?和一個字符串?s
?,判斷 s
?是否遵循相同的規律。
這里的?遵循?指完全匹配,例如,?pattern
?里的每個字母和字符串?s
?中的每個非空單詞之間存在著雙向連接的對應規律。
2.示例
pattern="abba"
s = "cat dog dog cat"
返回 true
pattern="abba"
s = "cat pig dog cat"
返回 false
pattern="ab"
s = "cat cat"
返回 false
提示
1 <= pattern.length <= 300
pattern
?只包含小寫英文字母1 <= s.length <= 3000
s
?只包含小寫英文字母和?' '
s
?不包含 任何前導或尾隨對空格s
?中每個單詞都被 單個空格 分隔
3.思路
哈希表:
????????首先看到映射相關問題就得聯想到哈希表,然后先分析特殊情況,比如s為空或者s里面的字母個數和pattern的個數不匹配則直接返回false,否則正常情況下,先將s通過spilt方法進行切割后,在遍歷s情況下,不存在的鍵值對應的映射就存入哈希表中,存在的就比較是否相等即可。
如果不了解哈希表則可以通過以下內容了解相關知識
Java類集框架(二)_Alphamilk的博客-CSDN博客
4.代碼
LeetCode代碼:
使用時間優先代碼:
class Solution {public boolean wordPattern(String pattern, String s) {
// 判斷兩種特殊情況if (s.length() ==0){return false;}String ss[] = s.split(" ");if (ss.length != pattern.length()){return false;}// 正常情況HashMap<Character,String> map = new HashMap<>();for (int i= 0;i<pattern.length();i++){if (!map.containsKey(pattern.charAt(i))){if (map.containsValue(ss[i])){return false;}map.put(pattern.charAt(i),ss[i]);}else {if (!map.get(pattern.charAt(i)).equals(ss[i])){return false;}}}return true;}
}
還有一種做法是通過構造兩個哈希表實現,內存上稍微會優于該算法,但是時間上會慢一些。
案例詳細代碼:
package LeetCode14;import java.util.Arrays;
import java.util.HashMap;public class javaDemo {public static void main(String[] args) {String pattern = "abbc";String s = "";boolean flag = true;// 判斷兩種特殊情況
// 當s為空if (s.length() ==0){flag = false;}
// 當ss中單詞個數與pattern個數不匹配情況String ss[] = s.split(" ");if (ss.length != pattern.length()){flag = false;}// 正常情況HashMap<Character,String> map = new HashMap<>();
// 遍歷整個patternfor (int i= 0;i<pattern.length();i++){
// 判斷是否存在鍵值if (!map.containsKey(pattern.charAt(i))){
// 判斷值是否已經對應其他鍵值if (map.containsValue(ss[i])){flag = false;break;}
// 不滿足前面條件的話就正常放入map.put(pattern.charAt(i),ss[i]);}else {
// 如果有存在的鍵,則進行比較if (!map.get(pattern.charAt(i)).equals(ss[i])){flag = false;break;}}}
// 輸出flagSystem.out.println(flag);}
}
會了?試試挑戰下一題!?(^?^●)ノシ (●′?`)??
LeetCode150道面試經典題-- 有效的字母異位詞(簡單)_Alphamilk的博客-CSDN博客