Leetcode題解 PalindromePairs

2021-03-02 程式設計師大白

點擊上方「程式設計師大白」,選擇「星標」公眾號

重磅乾貨,第一時間送達

題目分析:

給定一個字符串數組words,無重複字符串。問:有多少對不同的(i, j)滿足words[i]+words[j]是回文串?

解題思路(1)

暴力枚舉(i, j),判斷words[i]+words[j]是否是回文串。時間複雜度為O(n^2*k)。

解題思路(2)

將所有字符串逆序插入map。對於每個字符串s,枚舉分割點pos,滿足[pos ~ s.size()-1]是回文串,且[0 ~ pos-1]的逆串在map中存在。時間複雜度為O(n*K)。

算法的正確性:

思路1無需舉例。對於思路2,如words = ["bat", "tab", "cat"], 則map["tab"] = 0, map["bat"] = 1, map["tac"] = 2, 對於"bat", 我們發現map["bat"] = 1,且末尾串""為回文串。則(0, 1)為一解;對於"bat", 我們發現map["tab"] = 0,且末尾串""為回文串。則(1, 0)為一解。故答案為[[0, 1], [1, 0]]。

解法一

class Solution {
public:
    bool judge(string& a, string& b){
        int i = 0, j = b.size()-1;
        while(i < a.size()&&j >= 0&&a[i] == b[j]) i++, j--;
        if(i < a.size()&&j >= 0) return false;
        if(j < 0){
            j = a.size()-1;
            while(i < j&&a[i] == a[j]) i++, j--;
            return i >= j;
        }
        else{
            i = 0;
            while(i < j&&b[i] == b[j]) i++, j--;
            return i >= j;
        }
    }
    vector<vector<int>> palindromePairs(vector<string>& words) {
        vector<vector<int>> ans;
        for(int i = 0; i < words.size(); i++)
            for(int j = 0; j < words.size(); j++)
                if(i != j&&judge(words[i], words[j]))
                    ans.push_back({i, j});
        return ans;
    }
};

解法二

class Solution {
public:
 bool judge(string& str){
  int i = 0, j = str.size() - 1;
  while(i < j)
   if(str[i++] != str[j--]) return false;
  return true;
 }
 vector<vector<int>> palindromePairs(vector<string>& words) {
  unordered_map<string, int> ma;
  vector<vector<int>> ans;
  for(int i = 0; i < words.size(); i++)
   ma[{words[i].rbegin(), words[i].rend()}] = i;
  if(ma.find("") != ma.end()){
   for(int i = 0, k = ma[""]; i < words.size(); i++)
    if(words[i] != ""&&judge(words[i]))
     ans.push_back({k, i});
  }
  for(int i = 0; i < words.size(); i++) {
   for(int j = 0; j < words[i].size(); j++) {
    string l = words[i].substr(0, j), r = words[i].substr(j, words[i].size()-j);
    if(ma.find(l) != ma.end()&&judge(r)&&ma[l] != i)
     ans.push_back({i, ma[l]});
    if(ma.find(r) != ma.end()&&judge(l)&&ma[r] != i)
     ans.push_back({ma[r], i});
   }
  }
  return ans;
 }
};

重磅!程式設計師大白交流群-學術微信交流群已成立

額外贈送福利資源!邱錫鵬深度學習與神經網絡,pytorch官方中文教程,利用Python進行數據分析,機器學習學習筆記,pandas官方文檔中文版,effective java(中文版)等20項福利資源

獲取方式:進入群後點開群公告即可領取下載連結

注意:請大家添加時修改備註為 [學校/公司 + 姓名 + 方向]

例如 —— 哈工大+張三+對話系統。

號主,微商請自覺繞道。謝謝!

推薦閱讀

5款Chrome插件,第1款絕對良心!

為開發色情遊戲,這家公司赴日尋找AV女優拍攝,期望暴力賺錢結果...

拼多多終於釀成慘劇

華為阿里下班時間曝光:所有的光鮮,都有加班的味道

成都天府軟體園,一個程式設計師跳樓了……

關於程式設計師大白

程式設計師大白是一群哈工大,東北大學,西湖大學和上海交通大學的碩士博士運營維護的號,大家樂於分享高質量文章,喜歡總結知識,歡迎關注[程式設計師大白],大家一起學習進步!

相關焦點

  • leetcode刷題指南之PalindromePairs
    則(0, 1)為一解;對於"bat", 我們發現map["tab"] = 0,且末尾串""為回文串。則(1, 0)為一解。故答案為[[0, 1], [1, 0]]。gt;= j;11    }12    else{13        i = 0;14        while(i < j&&b[i] == b[j]) i++, j--;15        return i >= j;16    }17}18vector<vector<int>> palindromePairs
  • 一題一解(36)- How many pairs of 4-digit palindromes?
    一題:A palindrome is a positive integer whose digits are the same when
  • [每日一題]131. Palindrome Partitioning
    題目難度:Medium做題日期:2017年3月21日提交地址:https://leetcode.com/problems
  • Leetcode題解 WordBreak
    題解算法及複雜度(6 ms)  本問題是確定一個字符串是否能分割成多個單詞,這些單詞都在字典中出現.  由於本題每個組成成分都是單詞,也就是每次在原有字符串的返回true的基礎上增加一個字典中的單詞來組成新的能夠返回true的字符串.發現這是一種全局同一限制性的求解問題,限制條件是每次字符串增加的都是一個存在於字典中的單詞.舉個例子說明一下:  比如字符串是"leetcodeisnice
  • leetcode刷題指南之shortestPalindrome
    i+1;18        }19    }20    for (int i = len; i < n; i++) {21        s += h[i];22    }23    return s;24}25};作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀:leetcode
  • AK leetcode 流浪計劃 - 回文串
    *ing leetcode)。給大家準備了一些題目,供大家練習參考。幹他F.*ing (Fighting?)。八、實戰訓練代碼基礎訓練題光說不練假把式,學完了怎麼也要實操一下吧,快快動用把剛才那4題A了。
  • 初級樹狀數組 leetcode 練習題
    分享幾個簡單的樹狀數組練習題。一、背景之前分享了《樹狀數組模板》和《離散化模板》,今天來看幾道練習題。
  • 網際網路大廠算法面試題集合,看完我跪了!
    >leetcode 題解,記錄自己的 leetcode 解題之路。本倉庫目前分為五個部分:第一個部分是 leetcode 經典題目的解析,包括思路,關鍵點和具體的代碼實現。第二部分是對於數據結構與算法的總結第三部分是 anki 卡片, 將 leetcode 題目按照一定的方式記錄在 anki 中,方便大家記憶。
  • 我說你在 LeetCode 練死勁不好用,他說你這也沒用,我說我這個有用.
    他們說,有一個說我在 LeetCode 刷題,都快刷吐了,你能不能教教我混元功法?幫助提高一下我的刷題姿勢。我說小朋友你要按照戰術來刷題,我說你在 LeetCode 練死勁不好用,他不服氣,他說你這也沒用,我說我這個有用。
  • 笨方法刷 leetcode(一)
    最近在看leetcode,並且正在上面刷一些簡單級別的題目(不過說真的,這些題真的簡單嗎??或許是我太菜,有些感覺也很難)本篇記錄5道題的解題思路,可能都是最笨的方法題目描述:實現一個算法,確定一個字符串 s 的所有字符是否全都不同示例 1:輸入: s = "leetcode"輸出: false示例 2:輸入: s = "abc"
  • Leetcode題解 FindtheClosestPalindrome
  • 回溯法|一文解決四道 Leetcode「組合總和」題
    解集不能包含重複的組合。解集不能包含重複的組合。 組合總和」 和 「leetcode-40.1.2 題目分析當我們遇到:「可行解是什麼、可行解有多少個」這類問題時,最樸素的想法就是「枚舉」,枚舉出所有可能的結果,並在枚舉的過程中不斷刪除不符合條件的解。
  • Leetcode題解 ScrambleString
    推薦閱讀Leetcode題解 MaximalRectangleLeetcode題解 Word_SearchLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • Go 實現 LeetCode 全集
    Water - https://leetcode.com/problems/container-with-most-water/Binary[X] Sum of Two Integers - https://leetcode.com/problems/sum-of-two-integers/[X] Number of 1 Bits - https://leetcode.com
  • Leetcode題解 DecodeWays
    題解算法及複雜度(0 ms)  本題和爬梯子(第70題)那個題有點像,仔細考慮一下看看是不是這樣.推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • Leetcode題解 HouseRobber
    題意題解算法及複雜度(Run Time 0ms)這個一個求最優解的問題因為動態規劃常用來求最優解。先假定這個問題可以用動態規划進行求解,找最優子結構,假定求前n+1(n >= 2 )個房屋盜賊能偷到的最多的錢為dp[n]。由於每個房屋的錢都是非負的,所以前n+1個房屋的總的可以偷的錢,要麼與前n個房屋偷的錢相等,要麼等於前n-1個房屋可以偷的錢,加上第n+1個房屋的錢數,除了這兩種情況外,沒有其他情況。
  • Leetcode題解 Gray Code
    格雷碼:在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進位數不同,則稱這種編碼為格雷碼(Gray Code)解題思路:   簡單的模擬生成題,由于格雷碼要求相鄰的數字有且僅有一位不同,先考慮如果當前已經有不大於N-1位的合法格雷碼序列
  • LeetCode-53. Maximum Subarray | 最大子序和
    題解難度為簡單。temp = temp + nums[i] } else { temp = nums[i] } if temp > max { max = temp } } return max //返回最大值}執行結果:leetcode-cn
  • Leetcode題解 Rotate Array
    推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • 用這種解題方法,我解決了大部分的 leetcode 貪心算法題
    第一題,leetcode中等難度題目先來一道簡單的字典序排列的問題,這個題目我這裡不會用最優解來解決這個問題,這個是leetcode的中等難度的題目,最優解還是需要再思考一下的,這道題目作為文章開頭只是為了介紹我想要介紹的貪心的解題的一種思路而已,大佬請勿噴!!