BAT面試算法進階(5)- 最長迴文子串(方法一)

一.算法題

  • 題目

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.面試

  • Example

Example1:算法

Input: "babad"編程

Output: "bab"bash

Note: "aba" is also a valid answer.學習

Example2:ui

Input: "cbbd"spa

Output: "bb"3d

二.算法題解讀

  • 題目大意:給定一個字符串S,找出S串中最長的迴文子串.你能夠假設s的最大長度爲1000.

Example1: 輸入: "babad"code

輸出: "bab"orm

注意: "aba" 是一個有效答案.

Example2:

輸入: "cbbd"

輸出: "bb"

三.迴文字符串

Enter your image description here:

四.找到字符串的最長公共子串

通常開發者,能想到的最快速的方法,就是找到"最長公共子串".

"反轉S併成爲S',找到S和S'之間的最長公共子串.它也必須是最長的迴文子串"

Enter your image description here:

注意: 若是咱們並非全部的最長公共子串,就必定是最長迴文子串.

Enter your image description here:

因此,若是隻是單純的查找最長公共子串方法,是不可行的.可是,若是去修改這個問題?

思路: 在咱們找到一個最長的公共子串候選者時,咱們檢查子串的索引是否與反向子串的原始索引相同.若是是,那麼嘗試更新到目前爲止發現的最長的迴文.若是沒有,咱們就跳過這個,尋找下個候選迴文子串.

五.動態編程解決方案

  • 若是子串 Si...Sj 是迴文,則定義P[i,j]爲真,不然爲假
  • 因此,P[i,j] <-- (p[i+1,j-1] 和 Si = Sj);

六.複雜度

時間複雜度:O(N*N)

空間複雜度:O(N*N)

七.代碼

C Code

string longestPalindromeDP(string s) {
  int n = s.length();
  int longestBegin = 0;
  int maxLen = 1;
  bool table[1000][1000] = {false};
  for (int i = 0; i < n; i++) {
    table[i][i] = true;
  }
  for (int i = 0; i < n-1; i++) {
    if (s[i] == s[i+1]) {
      table[i][i+1] = true;
      longestBegin = i;
      maxLen = 2;
    }
  }
  for (int len = 3; len <= n; len++) {
    for (int i = 0; i < n-len+1; i++) {
      int j = i+len-1;
      if (s[i] == s[j] && table[i+1][j-1]) {
        table[i][j] = true;
        longestBegin = i;
        maxLen = len;
      }
    }
  }
  return s.substr(longestBegin, maxLen);
}

複製代碼

八.學習建議

嘗試畫圖->閱讀代碼

  • 算法並非1+1=2.不少時候須要你們拿好紙筆思考才能感覺到它的魅力之處!
  • 這次附上小編學習的時候草稿! 你們也一塊兒吧....

Enter your image description here:
感謝你們觀看這一篇文章,給你們獻上了iOS開發的188道面試題哦! 加小編的羣就能夠直接獲取哦!551346706
Enter your image description here:
Enter your image description here:
相關文章
相關標籤/搜索