Slice()嵌套用于循环值i和jKotlin

gpnt7bae  于 2022-12-13  发布在  Kotlin
关注(0)|答案(2)|浏览(103)

我想分割一个范围,我可以在Javascfript,但在Kotlin挣扎。
我当前代码是:

internal class blah {
    fun longestPalindrome(s: String): String {
        var longestP = ""
        for (i in 0..s.length) {
            for (j in 1..s.length) {
                var subS = s.slice(i, j)
                if (subS === subS.split("").reversed().joinToString("") && subS.length > longestP.length) {
                    longestP = subS
            }
        } 
    } 
        return longestP
}

我得到的错误是

Type mismatch.
Required:
IntRange
Found:
Int

有没有办法保留我的大部分代码?

tp5buhyn

tp5buhyn1#

如错误消息所示,slice需要一个IntRange,而不是两个Ints。因此,请传递一个range:

var subS = s.slice(i..j)

顺便说一句,你的代码中有一些bug:

  • 因为范围从0开始,所以需要迭代到length减1。但更简单的方法是直接获取indices范围:for (i in s.indices)
  • 我假设j应该是i或更大,而不是1或更大,否则你会冗余地检查一些倒置的字符串。它应该看起来像for (j in i until s.length)
  • 您需要使用==而不是===。第二个运算符用于引用相等,对于两个计算的字符串,即使它们相同,它也总是为false。
  • 我知道这可能只是练习,但即使有了上面的修正,如果String包含任何多代码单元代码点或任何字素簇,这段代码也会失败。正确的方法是将String转换为字素簇列表,然后执行算法,但这相当复杂,可能需要依赖一些String处理代码库。
zaq34kh6

zaq34kh62#

class Solution {
    fun longestPalindrome(s: String): String {
        var longestPal = ""
        for (i in 0 until s.length) {
            for (j in i + 1..s.length) {
                val substring = s.substring(i, j)
                if (substring == substring.reversed() && substring.length > longestPal.length) {
                    longestPal = substring
                }
            }
        }
        return longestPal
    }
}

此代码现在可以正常工作,但遗憾的是,它的优化程度不足以通过所有测试用例。

相关问题