嵌套循环值 i 和 j Kotlin 的 Slice()

Slice() nested for loop values i and j Kotlin

提问人:meWho 提问时间:12/5/2022 更新时间:12/6/2022 访问量:90

问:

我想切出一个范围,我可以在 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

有没有办法解决这个问题,保留我拥有的大部分代码?

Kotlin 多维数 组切片 嵌套循环

评论

0赞 sidgate 12/5/2022
为什么不发送到需要的地方?IntRange
0赞 meWho 12/5/2022
我不确定你说的那个@sidgate是什么意思
0赞 sidgate 12/5/2022
我建议了解 kotlin 中的函数定义、函数参数、类型系统。阅读函数的文档,它期望什么参数,什么是类sliceIntRange
0赞 bylazy 12/5/2022
范围从 i 到 j 是或只是 kotlinlang.org/docs/ranges.htmli.rangeTo(j)i..j

答:

1赞 Tenfour04 12/5/2022 #1

正如错误消息所说,需要一个 IntRange,而不是两个 Int。因此,给它传递一个范围:slice

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

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

  • 您需要迭代到长度减去 1,因为范围从 0 开始。但更简单的方法是直接抓取范围:indicesfor (i in s.indices)
  • 我假设应该是或更大,而不是 1 或更大,否则您将冗余地检查一些倒置的字符串。它应该看起来像 .jifor (j in i until s.length)
  • 您需要使用 而不是 .第二个运算符用于引用相等,对于两个计算的字符串,即使它们相同,它们也始终为 false。=====
  • 我知道这可能只是练习,但即使有上述修复,如果字符串包含任何多代码单元代码点或任何字素簇,此代码也会失败。正确的方法是将 String 转换为字素簇列表,然后执行算法,但这相当复杂,可能应该依赖于一些 String 处理代码库。
0赞 meWho 12/6/2022 #2
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
    }
}

此代码现在可以运行,但不幸的是,它还没有经过足够的优化,无法通过所有测试用例。