使用kotlin解决这个问题:5. 最长回文子串 提示 中等 6.5K 相关企业 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2: 输入:s = "cbbd" 输出:"bb" 提示: 1 <= s.length <= 1000 s 仅由数字和英文字母组成
时间: 2023-12-14 22:38:35 浏览: 164
kotlin官方中文文档
可以使用动态规划来解决这个问题。定义一个二维数组 dp,其中 dp[i][j] 表示 s[i:j+1] 是否是回文子串,如果是则为 true,否则为 false。显然,当 i=j 时,s[i:j+1] 一定是回文子串,因此 dp[i][j] = true。当 i<j 时,如果 s[i] == s[j] 并且 s[i+1:j] 是回文子串,则 s[i:j+1] 也是回文子串,即 dp[i][j] = dp[i+1][j-1] && s[i] == s[j]。
接下来,我们遍历所有可能的子串,找到最长的回文子串。具体做法是,从长度最长的子串开始遍历,如果找到了回文子串,则直接返回该子串。如果遍历完所有长度的子串都没有找到回文子串,则返回 s[0]。
以下是 Kotlin 的代码实现:
```
fun longestPalindrome(s: String): String {
val n = s.length
val dp = Array(n) { BooleanArray(n) }
var ans = ""
for (len in 0 until n) {
for (i in 0 until n - len) {
val j = i + len
if (len == 0) {
dp[i][j] = true
} else if (len == 1) {
dp[i][j] = s[i] == s[j]
} else {
dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j]
}
if (dp[i][j] && len + 1 > ans.length) {
ans = s.substring(i, j + 1)
}
}
}
return if (ans.isEmpty()) s[0].toString() else ans
}
```
该算法的时间复杂度为 O(n^2),空间复杂度为 O(n^2)。
阅读全文