LeetCode #5. Longest Palindromic Substring プログラミング練習
問題:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:Input: "cbbd"
Output: "bb"
難易度: medium
入力: String
目的: 入力された文字列の中で一番長い回文を探せ
出力: String
注意: 入力は最長で1000
palindromicは回文の意味です。
日本語で言うとトマトやしんぶんしなど、上から読んでも下から読んでも同じ文章を指します。
注意すべき事:
- 文字数が奇数か偶数かで判断が違う(aba, abba)
- 入力が空文字列の場合があるので気を付けるように
- 入力が一文字の場合も回文なのでそのまま返す
- 全部違う文字が入力された時、最長の回文は任意の文字になるので頭文字を返しましょう
今回私が書いた方法は非常にストレートで、全体探索をしてしました。
以下回答です。
class Solution { public String longestPalindrome(String s) { int len = s.length(); int right = 0; int left = 0; int maxlen = 0; if (len<2) return s; String result = s.substring(0,1); for (int i = 1; i<len; i++) { left = 1; right = 1; while (i-left >=0 && i+right < len && s.charAt(i-left) == s.charAt(i+right)) { if (maxlen < right+left+1) { result = s.substring(i-left, i+right+1); maxlen = right+left+1; } right++; left++; } left = 1; right = 0; while (i-left >=0 && i+right < len && s.charAt(i-left) == s.charAt(i+right)) { if (maxlen < right+left+1) { result = s.substring(i-left, i+right+1); maxlen = right+left; } right++; left++; } } return result; } }
文字列をforで回し、i番目を中心に回文になっているかどうかを判断する方法です。
whileが二つあるのは奇数か偶数かで分けているからです。
Time complexityはO(n^2)
あまり賢いやり方ではないですね
Dynamic Programming でも行ける!っという声もあるのですが結局はO(n^2)なのでここでは紹介しません。
時間があったらO(n)で行けるかもう一回考えよ
では