提问者:小点点

尝试使用kotlin检查有效的palindrom字符串问题解决,但有一个测试用例没有通过我尝试了几次


这就是问题所在如果在将所有大写字母转换为小写字母并删除所有非字母数字字符后,它向前和向后读取相同的内容,则短语是回文。字母数字字符包括字母和数字。

给定一个字符串s,如果它是回文,则返回true,否则返回false。

示例1:

Input: s="一个人,一个计划,一条运河:巴拿马"Output:true解释:"amanaplanacallpanama"是回文。示例2:

输入: s="赛车"输出:false解释:"raceacar"不是回文。

myCode

class Solution {
      fun isPalindrome(s:String):Boolean {
    var s1 = s.toLowerCase()
    var myStringBuilder = StringBuilder()
    var n = s1.length-1
    var n1=myStringBuilder.length

    for ( i in 0..n) {
        if (Character.isLetterOrDigit(s1[i])) {
            myStringBuilder.append(s1[i])
        }
    }
     for( i in 0 .. (n1/2)-1){
            if(myStringBuilder[i] != myStringBuilder[n1-i-1]){
                return false
            }
     } 
        return true
}
}

第一种情况通过,但根据结果Input: s="赛车结果true预期为false


共2个答案

匿名用户

您过早初始化n1

// create an -empty- StringBuilder
var myStringBuilder = StringBuilder()
...
// since it's empty, n1 == 0
var n1=myStringBuilder.length

在实际放入任何内容之前,您将其设置为StringBuilder内容的长度。这是您设置的一个简单值,它不是对长度getter的引用,当您访问它时,它会给出当前值。您设置一次,这就是它永远的值。

所以你的最后一个循环,检查它是否是回文的循环,从来没有真正运行过:

// since n1 is 0, this is for (i in 0..0)
for( i in 0 .. (n1/2)-1){

当您完成将内容添加到StringBuilder后,您可以通过初始化n1来修复它,这样您就可以获得它的最终长度:

for ( i in 0..n) {
    if (Character.isLetterOrDigit(s1[i])) {
        myStringBuilder.append(s1[i])
    }
}

// StringBuilder is complete, grab its final length
var n1 = myStringBuilder.length

// now you can use it
for (i in 0..(n1/2)-1) {

仅供参考,还有一个直到运算符,它的工作方式类似于,只是它不包括范围的最后一个值。所以你可以写

用于(i in 0直到(n1/2))

如果你想的话!

匿名用户

您可以使用这个简单的解决方案。

fun isPalindrome(s:String):Boolean {
    val str = s.filter { it.isLetterOrDigit() }.lowercase()
    for (i in 0..str.length/2 ){
        if (str[i]!=str[str.length-i-1])
            return false
    }
    return true
}

编辑:通过@cactustictacs评论,您可以以更简单的方式执行此操作。

fun isPalindrome(s:String):Boolean {
    val str = s.filter { it.isLetterOrDigit() }.lowercase()
    return str == str.reversed()
}