問題:
難易度:中
説明:
文字列を指定して、文字列セットの連続サブセットである最長の回文部分文字列を見つけます。
件名リンク:https://leetcode.com/problems/longest-palindromic-substring/
入力範囲:
1 <= s.length <= 1000
s
数字と英字(小文字および/または大文字)のみで構成され、
ケースを入力してください:
Example 1:
Input: s = "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: s = "cbbd"
Output: "bb"
Example 3:
Input: s = "a"
Output: "a"
Example 4:
Input: s = "ac"
Output: "a"
私のコード:
幸いなことに、入力の長さは1000未満なので、暴力的な死を恐れないでください。
一般に、2つの状況があります。
1.奇数のバブに挟まれた回文文字列はaの文字です
2.2つの間に挟まれたバーブでさえ
次に、配列を走査し、各ステップで奇数と偶数の回文を判断しますが、より良い方法は、各ステップで後続の繰り返される文字を直接削除することです。
str = "baab" str [1]に移動し、重複を除外するとします。baabの場合は、str [2]を除外して回文の判断を行います。このようにすると、比較が1つ少なくなります。奇妙なバブ、影響を受けないので、繰り返し文字が多いほど効率が高くなります。
Java:
class Solution {
public String longestPalindrome(String s) {
char[] chs = s.toCharArray();
int len = chs.length, cur = 0, max = 0, left = 0;
while(cur < len) {
int tcur = cur, tpre = cur;
while(tcur + 1 < len && chs[tcur] == chs[tcur + 1]) tcur ++; // 排除掉重复
cur = tcur == cur ? cur + 1 : tcur + 1;
while(tpre >= 0 && tcur < len && chs[tcur] == chs[tpre]) {// 再进行回文比较
tcur ++; tpre --;
}
int temp = tcur - tpre - 1;
if(temp > max) { // 获取最长
max = temp; left = tpre + 1;
}
}
return s.substring(left, left + max); // 省了个 right
}
}
C ++:
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length(), max = 0, cur = 0, left = 0;
while(cur < len) {
int tcur = cur, tpre = cur;
while(tcur + 1 < len && s[tcur] == s[tcur + 1]) tcur ++;
cur = tcur == cur ? cur + 1 : tcur + 1;
while(tpre >= 0 && tcur < len && s[tpre] == s[tcur]) {
tpre --; tcur ++;
}
int temp = tcur - tpre - 1;
if(temp > max) {
max = temp; left = tpre + 1;
}
}
return s.substr(left, max); // c++是从 i 开始,剪多少个字符
}
};
重複を除外せず、奇数と偶数を使用する場合は、これが当てはまります
Java:
public String longestPalindrome(String s) {
char[] chs = s.toCharArray();
int len = chs.length, cur = 1, max = 0, maxLeft = 0, maxRight = 0;
for(;cur < len;cur ++) {
if(chs[cur - 1] == chs[cur]) { // 偶数
int tpre = cur - 1, tcur = cur;
while(tpre >= 0 && tcur < len && chs[tpre] == chs[tcur]) {
tpre --; tcur ++;
}
int temp = tcur - tpre - 1;
if(temp > max) {
maxLeft = tpre + 1; maxRight = tcur - 1; max = temp;
}
}
if(cur + 1 < len && chs[cur + 1] == chs[cur - 1]) { // 奇数
int tpre = cur - 1, tcur = cur + 1;
while(tpre >= 0 && tcur < len && chs[tpre] == chs[tcur]) {
tpre --; tcur ++;
}
int temp = tcur - tpre - 1;
if(temp > max) {
maxLeft = tpre + 1; maxRight = tcur - 1; max = temp;
}
}
}
return s.substring(maxLeft, maxRight + 1);
}