STM32-定時器中斷實現
阿新 • • 發佈:2020-12-19
技術標籤:LeetCode刷題# 簡單leetcode演算法
290. 單詞規律
1 題目描述
給定一種規律 pattern 和一個字串 str ,判斷 str 是否遵循相同的規律。這裡的 遵循 指完全匹配,例如, pattern 裡的每個字母和字串 str 中的每個非空單詞之間存在著雙向連線的對應規律。
示例:
輸入: pattern = "abba", str = "dog cat cat dog" 輸出: true 輸入:pattern = "abba", str = "dog cat cat fish" 輸出: false 輸入: pattern = "aaaa", str = "dog cat cat dog" 輸出: false 輸入: pattern = "abba", str = "dog dog dog dog" 輸出: false
2 題目分析
還是練題練得少啊,一個簡單題目,思路是有的程式碼寫起來坎坷的要命。理一理思路吧。
根據題意,我們主要是判斷字串str是否滿足pattern模式,那麼我們可以用一個雜湊表來儲存這種對應關係,即建立一個雜湊表鍵值對分別是:pattern中的第i個元素和str中的第i個單詞,如果第一次出現這種模式則存入到雜湊表中,之後只需要在雜湊表中查詢是否有這種模式即可解決該問題。簡要分析到這裡,程式碼大致流程如下:
- 將字串str按照空格進行分割
- 如果分割出來的長度不等於pattern的長度,直接返回false
- 建立一個雜湊表<Character, String>
- 對pattern進行遍歷
- 如果map中不存在pattern.charAt(i)對應的value:那麼就可以分情況進行下一步操作,即如果str[i]不存在map中,則將該鍵值對放入map,否則表示該值已經與其他模式匹配上了,返回false即可
- 如果存在pattern.charAt(i)對應的value:只需判斷map中的value和str[i]是否相等,不相等則表明不匹配,同樣返回false,相等則繼續遍歷
- 遍歷結束,返回true
注:稍微有點繞,其實相當於我們要雙向判斷,既要判斷pattern.charAt(i)在map中是否有記錄,如果沒有記錄又要判斷str[i]在map中是否有記錄,帶著這樣的想法去理解流程就清晰多了。
3 程式碼
class Solution {
public boolean wordPattern(String pattern, String s) {
// 按照空格分隔s
String[ ] str = s.split(" ");
int len = pattern.length();
// 如果長度不一致返回false
if (str.length != pattern.length()) return false;
// 建立一個key:pattern.charAt(i);value:str[i]的雜湊表
Map<Character, String> hash = new HashMap<>();
for (int i = 0; i < len; i++) {
if(hash.get(pattern.charAt(i)) == null) { // map中不存在該鍵對應的值:放入或者返回false
if(!hash.containsValue(str[i])) { // str[i]不存在map則放入
hash.put(pattern.charAt(i), str[i]);
}else {
// 存在,說明該值在map中已經有其他對應的鍵了,已經不匹配了
return false;
}
} else { // map中存在該鍵對應的值
// 判斷該鍵對應的值是否和str[i]相等,不相等則返回false
if (!hash.get(pattern.charAt(i)).equals(str[i])) {
return false;
}
}
}
return true;
}
}
4 優化
這種解法時間複雜度有點高,可以參考官方題解的雙map解法,這裡就不列出來了。