125. 验证回文串:两个指针狭路相逢终成眷属的故事
2023-10-24 10:50:00
我们去超市买东西,或许会看到过这样一个场景:两个推着购物车的人,在过道上相向而行。如果两个人各自保持自己的行走轨迹,那么两个人就会重重地撞在一起。为了避免这种情况,双方不得不互相观察对方的动作,并调整自己的行走方向,最后两个人便各自分道扬镳了。
为什么我说这个事情呢?因为我们解决今天的难题时,所采用的方法与上面的场景有着异曲同工之妙。不过我们所面对的是字符串,这种字符串不一定是普通的字符串,而是一个回文串。
首先,我们要对回文串有一个基本的认识。回文串是指一个正着读和反着读都一样的字符串,例如"madam"和"1221"都是回文串。
在知道了回文串的概念后,我们就可以开始解决今天的难题了。为了方便我们理解,我们假设有一个字符串"hello"。首先,我们从字符串的两端分别选取一个字符,并将它们进行比较。如果这两个字符相同,那么我们就继续比较字符串两端的下一个字符。如果这两个字符不相同,那么我们就说这个字符串不是回文串。
在比较完字符串的两端的第一个字符后,我们再比较字符串两端的第二个字符。如果这两个字符相同,那么我们就继续比较字符串两端的下一个字符。如果这两个字符不相同,那么我们就说这个字符串不是回文串。
就这样,我们不断地比较字符串两端的字符,直到我们比较完整个字符串。如果我们比较完整个字符串后,所有的字符都相同,那么我们就说这个字符串是回文串。否则,我们就说这个字符串不是回文串。
具体来说,我们可以使用两个指针来比较字符串的两端的字符。这两个指针分别指向字符串的第一个字符和最后一个字符。然后,我们让这两个指针向中间移动。如果这两个指针所指向的字符相同,那么我们就将这两个指针向中间移动一步。如果这两个指针所指向的字符不相同,那么我们就说这个字符串不是回文串。
就这样,我们不断地让这两个指针向中间移动,直到这两个指针相遇。如果这两个指针相遇后,我们还没有发现这两个指针所指向的字符不相同,那么我们就说这个字符串是回文串。否则,我们就说这个字符串不是回文串。
这种方法的时间复杂度是O(n),其中n是字符串的长度。这种方法的空间复杂度是O(1),因为我们只需要两个指针来比较字符串的两端的字符。
现在,我们已经知道如何判断一个字符串是否是回文串了。接下来,我们就可以着手解决今天的难题了。
首先,我们要将字符串中的所有非字母和非数字字符删除。然后,我们将字符串中的所有字母转换为小写。最后,我们就可以使用上面的方法来判断字符串是否是回文串了。
class Solution {
public boolean isPalindrome(String s) {
// 将字符串中的所有非字母和非数字字符删除
s = s.replaceAll("[^a-zA-Z0-9]", "");
// 将字符串中的所有字母转换为小写
s = s.toLowerCase();
// 使用两个指针来比较字符串的两端的字符
int left = 0;
int right = s.length() - 1;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
// 如果两个指针相遇后,我们还没有发现这两个指针所指向的字符不相同,那么我们就说这个字符串是回文串
return true;
}
}