C LeetCode 214 最短回文串

2021-08-21 11:20:43 字數 1764 閱讀 8199

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。

示例 1:

輸入:"aacecaaa"

輸出:"aaacecaaa"

示例 2:

輸入:"abcd"

輸出:"dcbabcd"

這題考慮把字串s分成s1s2兩部分,即s=s1+s2,其中s1為回文串,s2不是回文串,那麼構成的最短回文串就是reverse(s2.begin(),s2.end())+s。所以這道題最大的難點就是找出從起始位置開始的最長回文子串。關於最長回文子串的解法可以參考最長回文子串(

dp做法是要考慮所有可能的回文串,但是這題只需要考慮從起始位置開始的字串就可以了,所以直接考慮從起始位置開始的所有字串,判斷是否是回文串即可,注意從大往小考慮,如果構成回文串,剩下的就可以不用考慮

**

class solution 

if(i>=j) break;

r--;

}string s1=s.substr(r+1,n-r-1);

reverse(s1.begin(),s1.end());

return s1+s;

}};

直接採用中心擴充套件來做,會有乙個case過不了,這裡有乙個小技巧。中心點不需要從起始位置開始,也不需要遍歷所有的,只要找到最大的就可以停止了。n=s.size(),那麼回文串最大就是s本身,所以只需要從n/2的位置開始往左遍歷即可,一旦找到從起始位置開始的回文串,就可以停止尋找,得出答案。這樣可以減少程式執行時間。

class solution 

string s1=s.substr(maxlen,n-maxlen);

reverse(s1.begin(),s1.end());

return s1+s;

}};

static

const

auto __ = () ();

class solution

if(i>=pos+curlen) r=1;

else r=pos+curlen-i;

while(i+r=0&&(tmp[i+r]==tmp[i-r])) r++;

slen[i]=r-1;

pos=i;

curlen=r-1;

if(maxr<=r-1&&i-slen[i]==0)

if(i+r==tmp.size()) break;

}string s1=s.substr(maxr,ns-maxr);

reverse(s1.begin(),s1.end());

return s1+s;

}};

class solution 

string tmp=s.substr(idx[n-1]+1,s.size()-idx[n-1]-1);

reverse(tmp.begin(),tmp.end());

return tmp+s;

}};

214 最短回文串

難度 困難 題目描述 思路總結 python字串反轉幾種方法 還是那句話,現階段注重的是數量,質量等後期提高。這題利用簡單的直覺做題,這種思路還需要再積累。沒見過這種題是很難想出來的。題解一 class solution def shortestpalindrome self,s str str 思...

214 最短回文串

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。示例 1 輸入 aacecaaa 輸出 aaacecaaa 示例 2 輸入 abcd 輸出 dcbabcd 這個題目可以轉化成找出該字串的最長回文字首。class solution for in...

LeetCode214 最短回文串

給定乙個字串s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。示例 1 輸入 aacecaaa 輸出 aaacecaaa 示例 2 輸入 abcd 輸出 dcbabcd 1 s s1 s2,其中s1是回文串,s2是s s1。2 ans 反轉後的s2 s cl...