回文字符串的定义:
回文字符串 是指一个字符串从左到右与从右到左遍历失去的序列是雷同的。也就是说不论从左读,还是从右读,都是一样的,相似数学上学习的轴对称图形,例如“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、数据库、数据结构与算法等。