Raptor-回文字符串判断

1. 题目描述

输入一个字符串,判断其是否是回文。回文是正向拼写与反向拼写都一样的字符串。例如:"abcba"和"abccba"都是回文。

2. 算法分析

我们在Raptor中输入字符串,记为 s,在Raptor中,字符串 s 是以字符数组的形式存在,我们可以利用数组对回文字符串进行判断。

比如字符数组 s = "abcdeedcba",这个数组的长度也即末端索引位置可以用自带函数 length_of 来获取。我们定义两个循环变量 i 和 j,其中 i 记录起始索引的位置,初始值 i=1;j 记录末端索引的位置,初始值 j=length_of(s)。利用循环,从两头向中间逼近,依次判断 s[i] 和 s[j] 是否相等。如果一直到 i>=j 时, s[i] 和 s[j] 仍然相等,说明这个字符串就是回文字符串;如果中间某一步 s[i]=s[j] 不成立,那么退出循环,最后 i 必然小于 j。

这样,循环结束的条件可以设为满足 i>=j or s[i] != s[j],其中 i>=j 是回文结束的条件,s[i]!=s[j]是非回文结束的条件。(这里的 != 表示不等于)

举两个例子:

2.1 回文字符串例子s = "abcdeedcba"

初始值 i=1, j=length_of(s)=10

  • s[i]= 'a', s[j]='a', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=2, j=9);
  • s[i]= 'b', s[j]='b', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=3, j=8);
  • s[i]= 'c', s[j]='c', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=4, j=7);
  • s[i]= 'd', s[j]='d', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=5, j=6);
  • s[i]= 'e', s[j]='e', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=6, j=5);
  • s[i]='e', s[j]='e',满足 i>=j or s[i] != s[j],循环结束。

此时 i>=j,字符串 s 是回文字符串。

2.2 非回文字符串例子 s="abceba"

初始值 i=1, j=length_of(s)=6

  • s[i]= 'a', s[j]='a', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=2, j=5);
  • s[i]= 'b', s[j]='b', 不满足 i>=j or s[i] != s[j],此时执行 i=i+1, j=j-1 (这时 i=3, j=4);
  • s[i]= 'c', s[j]='e', 满足 i>=j or s[i] != s[j],循环结束。

流程结束,此时不满足 i>=j,字符串 s 不是回文字符串。

3. 流程图

 

4.测试结果

4.1 回文字符串例子s = "abcdeedcba"

 

4.2 非回文字符串例子 s="abceba"

5. 特殊说明 (回文数字判断)

本题中的程序仅用于判断字符串是否回文,无法判断数字是否回文,为什么呢?因为Raptor对于输入框中的内容,如果仅为数字,不包含除了数字之外的其它字符,则当做数字处理。这时,如果我们直接用本程序,就会出现如下错误 "s is not a 1D array",这时s仅为一个数字,不是一维数组,无法进行数组索引操作。

如果输出框中包含除数字之外的其它字符,那么这个输入就会被当做一个字符串,这样,我们可以借助特殊字符包裹数字,进行回文数的判断。例如我们在数字两边加上 "#",输入变成 #123321#,就可以利用回文字符串的程序来判断数字是否为回文数了,如下:

 当然,这里的特殊符号可以任意取,只要包裹在输入数字两边的一样就可以了。回文数判断相当于拓展自回文字符串判断,需要在输入数字的两边加上特殊符号,以形成字符串。下一篇博客我们将聚焦回文数判断,发展针对数字的回文数判断程序。

 

 

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏雪无痕是个小疯子

您的鼓励将促使我的创作更有价值

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值