文字列 を指定してs
、s
内の最長の回文部分文字列を見つけます。
例 1:
入力: s = "babad"
出力: "bab"
説明: "aba" も質問に対する答えです。
例 2:
入力: s = "cbbd"
出力: "bb"
ヒント:
1 <= s.length <= 1000
s は数字と文字のみで構成されます
この質問はアイデアを見ずに答えることはできません。。。
- 質問の意味を理解する
- タイトル文字列を指定
- この文字列の中で最長の回文を見つける必要があります
- 回文: 前から見ても後ろから読んでも同じ文字列
- 全体のアイデア
- 「中心点から両側に広げて回文列を見つける」という回文の基本的な考え方に基づいて問題を解きますが、この方向はすべての点を中心点として列挙するのと同じです。
- 「bab」など、回文文字列が奇数の場合、その中心点には「a」が 1 つしかないため、「a」から両側に広がります。
- 「baab」のように回文文字列が偶数の場合、中心点に「aa」が2つあるため、「aa」から両側に広がります。
- 回文文字列を検索する補助関数を作成し、中心点が決定されたときに補助関数を呼び出し、見つかった回文文字列を直接返します。
- 毎回見つかった回文文字列を前回のものと比較し、長い方を保持します。
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let str = ""
for(let i=0; i<s.length; i++){//abba
//穷举中心点
let subString1 = findHuiWen(s,i,i)
let subString2 = findHuiWen(s,i,i+1)
str = str.length > subString1.length ? str : subString1
str = str.length > subString2.length ? str : subString2
}
return str
};
function findHuiWen(s, left, right){
while(left >=0 && right < s.length) {
if(s.charAt(left) == s.charAt(right)) {
left--
right++
} else {
break
}
}//执行结束left和right都回退一个,但是substring方法左闭右开[,),因此right保持不变
return s.substring(left+1,right)
}
使用される知識ポイント:
String.prototype.charAt()
charAt()メソッドは、文字列から指定された文字を返します。
str.charAt(インデックス)
String.prototype.substring()
substring()
このメソッドは、開始インデックスと終了インデックスの間の文字列のサブセット、または開始インデックスから文字列の終わりまでのサブセットを返します。
str.substring(インデックス開始[, インデックス終了])