这就是问题所在如果在将所有大写字母转换为小写字母并删除所有非字母数字字符后,它向前和向后读取相同的内容,则短语是回文。字母数字字符包括字母和数字。
给定一个字符串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
您过早初始化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()
}