<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)291:?jiǎn)卧~規(guī)律II

          共 4421字,需瀏覽 9分鐘

           ·

          2021-06-12 21:45

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做 單詞規(guī)律II,我們先來(lái)看題面:
          https://leetcode-cn.com/problems/word-pattern-ii/

          Given a pattern and a string str, find if strfollows the same pattern.

          Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty substring in str.

          給你一種規(guī)律 pattern 和一個(gè)字符串 str,請(qǐng)你判斷 str 是否遵循其相同的規(guī)律。

          這里我們指的是 完全遵循,例如 pattern 里的每個(gè)字母和字符串 str 中每個(gè) 非空 單詞之間,存在著雙向連接的對(duì)應(yīng)規(guī)律。


          示例


          示例1:
          輸入: pattern = "abab", str = "redblueredblue"
          輸出: true

          示例2:
          輸入: pattern = "aaaa", str = "asdasdasdasd"
          輸出: true

          示例3:
          輸入: pattern = "aabb", str = "xyzabcxzyabc"
          輸出: false
           
          提示:
          你可以默認(rèn) pattern 和 str 都只會(huì)包含小寫(xiě)字母。


          解題

          https://www.cnblogs.com/grandyang/p/5325761.html

          這道題是之前那道 Word Pattern 的拓展,之前那道題詞語(yǔ)之間都有空格隔開(kāi),這樣可以一個(gè)單詞一個(gè)單詞的讀入,然后來(lái)判斷是否符合給定的特征,而這道題沒(méi)有空格了,那么難度就大大的增加了。

          因?yàn)槲覀儾恢缹?duì)應(yīng)的單詞是什么,所以得自行分開(kāi),可以用回溯法來(lái)生成每一種情況來(lái)判斷,這里還是需要用 HashMap 來(lái)建立模式字符和單詞之間的映射,還需要用變量p和r來(lái)記錄當(dāng)前遞歸到的模式字符和單詞串的位置,在遞歸函數(shù)中,如果p和r分別等于模式字符串和單詞字符串的長(zhǎng)度,說(shuō)明此時(shí)匹配成功結(jié)束了,返回 ture,反之如果一個(gè)達(dá)到了而另一個(gè)沒(méi)有,說(shuō)明匹配失敗了,返回 false。如果都不滿足上述條件的話,取出當(dāng)前位置的模式字符,然后從單詞串的r位置開(kāi)始往后遍歷,每次取出一個(gè)單詞,如果模式字符已經(jīng)存在 HashMap 中,而且對(duì)應(yīng)的單詞和取出的單詞也相等,那么再次調(diào)用遞歸函數(shù)在下一個(gè)位置,如果返回 true,那么就返回 true。

          反之如果該模式字符不在 HashMap 中,要看有沒(méi)有別的模式字符已經(jīng)映射了當(dāng)前取出的單詞,如果沒(méi)有的話,建立新的映射,并且調(diào)用遞歸函數(shù),注意如果遞歸函數(shù)返回 false 了,要在 HashMap 中刪去這個(gè)映射,參見(jiàn)代碼如下:


          class Solution {
          public:
              bool wordPatternMatch(string pattern, string str) {
                  unordered_map<char, string> m;
                  return helper(pattern, 0, str, 0, m);
              }
              bool helper(string pattern, int p, string str, int r, unordered_map<char, string> &m) {
                  if (p == pattern.size() && r == str.size()) return true;
                  if (p == pattern.size() || r == str.size()) return false;
                  char c = pattern[p];
                  for (int i = r; i < str.size(); ++i) {
                      string t = str.substr(r, i - r + 1);
                      if (m.count(c) && m[c] == t) {
                          if (helper(pattern, p + 1, str, i + 1, m)) return true;
                      } else if (!m.count(c)) {
                          bool b = false;
                          for (auto it : m) {
                              if (it.second == t) b = true;
                          }
                          if (!b) {
                              m[c] = t;
                              if (helper(pattern, p + 1, str, i + 1, m)) return true;
                              m.erase(c);
                          }
                      }
                  }
                  return false;
              }
          };


          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:
          LeetCode1-280題匯總,希望對(duì)你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)281:鋸齒迭代器
          LeetCode刷題實(shí)戰(zhàn)282:給表達(dá)式添加運(yùn)算符
          LeetCode刷題實(shí)戰(zhàn)283:移動(dòng)零
          LeetCode刷題實(shí)戰(zhàn)284:頂端迭代器
          LeetCode刷題實(shí)戰(zhàn)285:二叉搜索樹(shù)中的順序后繼
          LeetCode刷題實(shí)戰(zhàn)286:墻和門(mén)
          LeetCode刷題實(shí)戰(zhàn)287:尋找重復(fù)數(shù)
          LeetCode刷題實(shí)戰(zhàn)288:?jiǎn)卧~的唯一縮寫(xiě)
          LeetCode刷題實(shí)戰(zhàn)289:生命游戲
          LeetCode刷題實(shí)戰(zhàn)290:?jiǎn)卧~規(guī)律


          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一道本一区二区日韩一区二区 | 视频无码在线 | 亚洲欧洲欧美日韩中文字幕 | 伊人成人网络 | a级免费网站 |