一、需求
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。
示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。
示例 4:
输入:s = "0P"
输出:false
解释:"0P" 不是回文串。
示例 5:
输入: s = "A,m a c: (ama)"
输出:true
解释:"amacama" 是回文串。
提示:
1 <= s.length <= 2 * 105
s
仅由可打印的 ASCII 字符组成
二、思路分析图
三、代码
(一)数据初始化/调用函数
/**
* 入口
* 125、验证回文串
* 输入:
* "A man, a plan, a canal: Panama"
* 输出:
* 5
* 解释:
* 1.while
* 2.for
*/
@Test
public void suanfa30()
{
// 初始化
// String s = "A man, a plan, a canal: Panama";
// String s = "0P";
// String s = "Damosel, a poem? A carol? Or a cameo pale? (So mad!)";
String s = "A,m a c: (am a)!";
// 打印
boolean a = this.isPalindrome(s);
System.out.println("验证回文串(双指针for方案) = " + a);
boolean b = this.isPalindromeWhile(s);
System.out.println("验证回文串(双指针while方案) = " + b);
boolean c = this.isPalindromeCharacter(s);
System.out.println("验证回文串(反转Character方案) = " + c);
}
(二)双指针for方案
/**
* 双指针for方案
*
* @param s
* @return
*/
private boolean isPalindrome(String s)
{
// 转为小写,并替换非0-9数字和a-z的字符为""
String s2 = s.toLowerCase().replaceAll("[^0-9a-z]", "");
// 循环,条件一半数就好
for (int i = 0; i < s2.length() / 2; i++)
{
// 开始第一个数 不等于 最后一个数
if (s2.charAt(i) != s2.charAt(s2.length() - i - 1))
{
// 不等于就返回false
return false;
}
}
// 剩下的都符合了
return true;
}
(三)双指针while方案
/**
* 双指针while方案
*
* @param s
* @return
*/
private boolean isPalindromeWhile(String s)
{
String s2 = s.toLowerCase().replaceAll("[^0-9a-z]", "");
int index = 0;
int i1 = s2.length() / 2;
while (index < i1)
{
if (s2.charAt(index) != s2.charAt(s2.length() - index - 1))
{
return false;
}
index++;
}
return true;
}
(四)反转Character方案
/**
* 反转Character方案
*
* @param s
* @return
*/
private boolean isPalindromeCharacter(String s)
{
StringBuffer sgood = new StringBuffer();
int length = s.length();
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
if (Character.isLetterOrDigit(ch)) {
sgood.append(Character.toLowerCase(ch));
}
}
StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
return sgood.toString().equals(sgood_rev.toString());
}
(五)结果图
作者:王子威
四、总结
- 学习了验证回文串
- 效率很低,还没想到效率高的
- 学习了下Character类,这个是char的封装,也是工具
- StringBuffer会效率高些
- 算法兴趣+1 总:30
- 加强了对算法的分析能力