回文字符串的定义:
回文字符串是指一个字符串从左到右与从右到左遍历失去的序列是雷同的。也就是说不论从左读,还是从右读,都是一样的,相似数学上学习的轴对称图形,例如“abcba”、“NBAABN”是回文字符串,而“abcd”不是回文字符串。
常见的实现思路有以下两种:
- 首尾双向遍历,如果某个字符不雷同,则不是回文字符串;
- 反转字符串,比拟反转后的字符串与原字符串是否雷同;
示例1 — 首尾双向遍历
private static boolean isPalindrome(String str) { if (str == null) { return false; } int low = 0; int high = str.length() - 1; while (low < high) { if (str.charAt(low) != str.charAt(high)) { return false; } low++; high--; } return true; }
也能够采纳for循环来实现首尾双向遍历,如下:
private static boolean isPalindrome(String str) { if (str == null) { return false; } int length = str.length(); for (int low = 0, high = length - 1; low < high; low++, high--) { if (str.charAt(low) != str.charAt(high)) { return false; } } return true; }
示例2 — 反转字符串
private static boolean isPalindrome(String str) { if (str == null) { return false; } char[] chars = str.toCharArray(); for (int start = 0, end = chars.length - 1; start <= end; start++, end--) { char tempChar = chars[start]; chars[start] = chars[end]; chars[end] = tempChar; } return String.valueOf(chars).equals(str); }
下面反转字符串也是采纳了首尾双向遍历的思路,通过长期变量的形式,实现两个字符的替换。除了首尾双向遍历形式外,也能够采纳单向遍历的形式实现字符串的反转,如下:
private static boolean isPalindrome(String str) { if (str == null) { return false; } int length = str.length(); char[] chars = new char[length]; for (int i = 0; i < length; i++) { chars[i] = str.charAt(length - i - 1); } return String.valueOf(chars).equals(str); }
下面的两种形式,都是采纳间接遍历的形式,当然也能够借助 StringBuilder 或 StringBuffer 的 reverse()
办法实现字符串反转,而后再判断字符串是否为回文字符串
private static boolean isPalindrome(String str) { if (str == null) { return false; } return new StringBuilder(str).reverse().toString().equals(str); }
或
private static boolean isPalindrome(String str) { if (str == null) { return false; } return new StringBuffer(str).reverse().toString().equals(str); }
延长:
- 给定一个字符串,如何实现字符串的反转?
- 给定一个数组,如何实现数组元素的反转?
测试验证
public static void main(String[] args) { System.out.println(isPalindrome(null)); System.out.println(isPalindrome("")); System.out.println(isPalindrome("abcd")); System.out.println(isPalindrome("abcba")); }
输入的后果如下:
false
true
false
true
更多无关Java面试相干的知识点能够关注【Java面试手册】小程序,波及Java根底、多线程、JVM、Spring、Spring Boot、Spring Cloud、Mybatis、Redis、数据库、数据结构与算法等。