Reverse a String and Check a Palindrome
javaJavabeginnerinterview-prepjava
Two classic warm-up problems: reverse a string in place with two pointers, and test a palindrome while ignoring case and punctuation.
public class StringTools {
public static void main(String[] args) {
System.out.println(reverse("interview")); // weivretni
System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("Hello")); // false
}
// Swaps characters from both ends of a char array. O(n) time, no StringBuilder.reverse() needed.
static String reverse(String text) {
char[] chars = text.toCharArray();
for (int left = 0, right = chars.length - 1; left < right; left++, right--) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
}
return new String(chars);
}
// Two pointers from both ends, skipping punctuation and ignoring case. O(n) time, O(1) extra space.
static boolean isPalindrome(String text) {
int left = 0, right = text.length() - 1;
while (left < right) {
if (!Character.isLetterOrDigit(text.charAt(left))) { left++; continue; }
if (!Character.isLetterOrDigit(text.charAt(right))) { right--; continue; }
if (Character.toLowerCase(text.charAt(left)) != Character.toLowerCase(text.charAt(right))) return false;
left++;
right--;
}
return true;
}
}