1. 程式人生 > 實用技巧 >STM32-定時器中斷實現

STM32-定時器中斷實現

技術標籤: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個單詞,如果第一次出現這種模式則存入到雜湊表中,之後只需要在雜湊表中查詢是否有這種模式即可解決該問題。簡要分析到這裡,程式碼大致流程如下:

  1. 將字串str按照空格進行分割
  2. 如果分割出來的長度不等於pattern的長度,直接返回false
  3. 建立一個雜湊表<Character, String>
  4. 對pattern進行遍歷
    1. 如果map中不存在pattern.charAt(i)對應的value:那麼就可以分情況進行下一步操作,即如果str[i]不存在map中,則將該鍵值對放入map,否則表示該值已經與其他模式匹配上了,返回false即可
    2. 如果存在pattern.charAt(i)對應的value:只需判斷map中的value和str[i]是否相等,不相等則表明不匹配,同樣返回false,相等則繼續遍歷
  5. 遍歷結束,返回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解法,這裡就不列出來了。