这些天,我浏览 Linkedin 和 Twitter,看到一个非常常见的编码挑战:检查字符串是否是回文。
这是一个非常简单的挑战。回文是可以向内和向后读相同的单词或短语。就像:
等等。
但是人们遵循的一般方法是这样的:
换句话说,他们获取原始字符串,然后反转它,然后将其与原始字符串进行比较。
这是一个非常有效的方法,但我想建议一个聪明的方法。
看到您需要为字符串生成一个新的分配,然后逐个字符进行比较。更具挑战性的是,如何使用 O(1) 更多内存并进行更少比较?
让我更好地解释一下。
解决这个问题的更好方法是使用两指针方法。
字符串只不过是一个字符数组,我们可以逐个字符地遍历它,并对数组中的任何字符进行遍历和比较。
让我们使用两个指针的新方法来重构它。
我们需要做的第一件事是从中取出符文切片:
r := []rune(str);
Go 中的字符串是只读的,所以基本上,字符串是不可变的,无法更改。符文切片,否则可以更改,然后,两者之间的转换会复制字符串字节,但是,我们不会在这里复制另一个副本,因为我们将在同一个堆栈帧中继续,并且我们不会将产生一个新字符串。
之后,我们将开始循环,一个指针位于符文的开头,另一个指针位于符文的末尾,我们将遍历它,直到一个指针与另一个指针交叉。我们将在这里进行比较:
func isPalindrome(str string) bool { r := []rune(str) for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { if r[i] != r[j] { return false } } return true }
这样,如果比较顺利,并且所有字符都相同,那么它就是回文。否则,立即返回 false。
以上是检查回文的另一种方法的详细内容。更多信息请关注PHP中文网其他相关文章!