输入的字符串分为三种情况:
本身就是回文字符串,如:aba、bddb、vvvvv和vvvv等。
本身不是回文字符串,但是可以通过删除一个字符成为回文字符串,如:abca、deeee、eddze和aydmda等。
本身不是回文字符串,不能通过仅删除一个字符成为回文字符串,如:abc、cdef等。
首先使用一个while循环可以对第1.种情况进行初筛。aba型,i和j指针将会相等;bddb型i指针将会超越j指针一位。这种情况erase_num始终为0,因此不会进入删除字符环节,直接返回true。
while (i < j) {
// 本身就是回文串的情况,在这个while循环结束后,直接返回true
if (s[i] != s[j]) {
erase_num++; // 检测到字符不等,说明需要进行删除操作,操作数自加1
break; // 同时跳出while循环,进行下一步删除操作
}
i++;
j--;
}
需要删除字符的字符串将会进入删除步骤,删除又将分两种情况,是删除i指针所在的位置还是j指针所在的位置呢?
事实是这两种情况都要进行一次,最后通过erase_num来判断结果,不能只通过当前指针下一位或者上一位与另一个指针所指的字符是否相等来判断,因为会出现以下情况:
————————————————
版权声明:本文为CSDN博主「菠萝开方」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40838478/article/details/117979613
一种新的回文检测算法:
package main
import "fmt"
func main() {
var str string = "aba"
res := []rune(str)
var len = len(res)
var halfLen = len / 2
var i int
for i = 0; i < halfLen; i++ {
if res[i] != res[len-i-1] {
break
}
}
if i == halfLen {
fmt.Println(res, "是回文")
} else {
fmt.Println(res, "不是回文")
}
}
只要理解了回文是互补的,这个问题就很好解决了。