如何解决回文与对称以及如何处理 2 字字符
我们可以说一个有 2 个字符的单词是回文吗?比如“oo”是回文而“go”不是?
我正在执行一个从 GeeksForGeeks 中检测回文的程序,但它也将 go
检测为回文,尽管它不是:
# Function to check whether the
# string is plaindrome or not def palindrome(a):
# finding the mid,start
# and last index of the string
mid = (len(a)-1)//2
start = 0
last = len(a)-1
flag = 0
# A loop till the mid of the
# string
while(start<mid):
# comparing letters from right
# from the letters from left
if (a[start]== a[last]):
start += 1
last -= 1
else:
flag = 1
break;
# Checking the flag variable to
# check if the string is palindrome
# or not
if flag == 0:
print("The entered string is palindrome")
else:
print("The entered string is not palindrome")
# ... other code ...
# Driver code
string = 'amaama'
palindrome(string)
是否有任何特定的长度或条件将单词定义为回文?我阅读了 Wikipedia article,但没有发现回文长度的任何特定条件。
上面的程序将go检测为回文,因为中点为0,即“g”,起点为0,也是“g”,因此判断为回文。但我仍然对字符数感到困惑。 2个数字可以是回文吗?如果是,那么我们是否需要为其添加特定条件:if word[0] == word[1]
?
解决方法
先来看看回文的定义,according to Merriam-Webster:
一个单词、诗句或句子(例如“Able was I ere I seen Elba”)或一个数字(例如 1881),前后读相同
因此,两个字符的单词(或任何偶数字符的单词)也可以是回文。示例代码写得不好,在两个字符串的情况下不能正常工作。正如您正确推断的那样,如果字符串的长度为 2,它会将 mid
变量设置为 0
。然后立即跳过循环 while (start < mid)
,作为 start
也初始化为 0。因此,flag
变量(初始化为 0
,对应于“is a palindrome”)永远不会改变,因此函数错误地打印出 go
is a palindrome .
您可以通过多种方式调整算法;其中最简单的方法是通过将 while
条件更改为 start <= mid
来简单地检查并包括中间字符索引。请注意,这只是调整给定代码的最简单方法,检查字符串是否为回文的最简单的 Python 代码段要简单得多(因为您可以使用 {{1} },并将其与原始字符串进行比较)。
(编辑添加:trincot 的另一个答案实际上表明所提供的算法对于所有偶数字符单词都是不正确的。此答案中建议的修复仍然有效。)
,你的问题是有道理的。您引用的 GeeksForGeeks 代码没有给出正确的结果。事实上,它也会对较长的词产生错误的结果,比如“gang”。
上面的程序检测到“go”是回文,因为中点是0,也就是“g”,起点是0,也是“g”,所以判断它是回文。
这确实是算法出错的地方。
...那么我们是否需要为它添加一个特定的条件:python -u file.py argument
?
鉴于 if word[0] == word[1]
条件是 while
,中点应该是第一个索引 after 必须验证的字符串的前半部分,所以在这种情况下一个 2 个字母的单词,中点应该是 1,而不是 0。
纠正程序中的错误很容易。更改:
start<mid
致:
mid = (len(a)-1)//2
这解决了问题。无需额外的代码行即可将此视为单独的案例。
我没有发现任何关于回文长度的特殊条件。
你是对的:没有这样的条件。 GeeksForGeeks 代码让你怀疑,但你从一开始就是对的,代码是错误的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。