Някои задачи в програмирането имат статут на класически. Обикновено такива задачи са свързани с математика и те много обичат да задават студенти от специалностите по компютърни науки, Howто и търсещи работа на интервюта. Те са добри, защото помагат да настроите мисленето си по програмист доста добре, Howто и да го тренирате. Един от тези проблеми е проверката дали даден низ е палиндром и ние ще го разгледаме в тази статия.
Какво е палиндром и защо можете да ги търсите
Палиндромът е число, буквена комбинация, дума or текст, които се четат еднакво и в двете посоки. За да обобщим, палиндром може да се нарече всеки набор от знаци, който е симетричен спрямо средата си. Думата е от гръцки корени, които буквално произлизат от „бягане назад“ (palin е „отново назад“ и dromos „бягане“). Палиндром в Java означава същото като общото meaning. Примери за палиндроми:- 1881 г
- aaqquqqaa
- поп
- По обяд
- ниво
- Ротатор
- Моят фитнес
- Госпожо, аз съм Адам
- Сега, сър, войната е спечелена!
Пример за code на алгоритъм на палиндром
Нека да помислим. Низът е поредица от знаци, може да се каже, масив от char. Най-логично би било да следвате тази последователност от двете страни до средата и да сравните крайните знаци. Ако докато стигнем до средата, всичките ни герои съвпадат, тогава имаме палиндром. Нека създадем булев метод validPalindrome(String s), за да проверим дали String е палиндром. Java codeът е тук:
public class PalindromeTest1 {
//method to check if a string is palindrome
public static boolean validPalindrome(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
if (s.charAt(i) != s.charAt(j)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!"
boolean b1 = validPalindrome(s1);
boolean b2 = validPalindrome(s2);
boolean b3 = validPalindrome(s3);
boolean b4 = validPalindrome(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
В основния метод проверяваме за палиндромни низове „level“, „cool“, „Madam“ и „Сега, сър, войната е спечелена!“. Както можете да видите, първото, третото и четвъртото са палиндроми, но второто не е. Какво ще даде програмата?
нивото палиндром ли е? вярно ли е готиното палиндром? невярно мадам палиндром ли е? false е Сега, сър, войната е спечелена! палиндром? невярно
И така, първото е палиндром, второто не е. Какво обаче не е наред с третия и четвъртия? Защо резултатът е фалшив ? Вероятно вече се досещате, че въпросът е, че някои символи в този низ са главни, а други малки, а за Java M и m са два различни знака. Нека подобрим програмата, за да вземе предвид тази разлика. Ето програма за проверка дали даден низ е палиндром, която решава проблеми с главни и малки букви.
public class PalindromeTest2 {
//lowercase and uppercase characters should be treated the same:
public static boolean validPalindrome(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
return false;
}
return true;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!"
boolean b1 = validPalindrome(s1);
boolean b2 = validPalindrome(s2);
boolean b3 = validPalindrome(s3);
boolean b4 = validPalindrome(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
Този път резултатът е по-предвидим за нас:
нивото палиндром ли е? вярно ли е готиното палиндром? невярно мадам палиндром ли е? вярно е Сега, сър, войната е спечелена! палиндром? невярно
Е… не е точно предсказуемо. Ситуацията с „госпожо“ се подобрява, но Howво ще кажете за нашия дълъг и щастлив палиндром „Сега, господине, войната е спечелена!“. Много е лесно, ако помните, че всички интервали и препинателни знаци са същите като буквите за Java. Така че трябва отново да подобрим нашия алгоритъм, за да коригираме този пропуск. Нека научим нашата програма да игнорира интервали и препинателни знаци. Просто казано, ние игнорираме всички небуквено-цифрови знаци. Ето подобрената програма за палиндром в Java.
public class PalindromeTest3 {
//in addition to the above, ignore all non alphanumeric chars like punctuation and spaces
private static boolean isAlphanumeric(char c) {
return Character.isAlphabetic(c) || Character.isDigit(c);
}
public static boolean validPalindromeIgnorePunctuation(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
// skip chars we should ignore
while (j >= 0 && !isAlphanumeric(s.charAt(j))) j--;
while (i < s.length() && !isAlphanumeric(s.charAt(i))) i++;
// overskipped -> nothing left to validate
if (i >= j) return true;
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
return false;
}
return true;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!";
boolean b1 = validPalindromeIgnorePunctuation(s1);
boolean b2 = validPalindromeIgnorePunctuation(s2);
boolean b3 = validPalindromeIgnorePunctuation(s3);
boolean b4 = validPalindromeIgnorePunctuation(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
Поне резултатът е това, което очаквахме от него:
нивото палиндром ли е? вярно ли е готиното палиндром? невярно мадам палиндром ли е? вярно е Сега, сър, войната е спечелена! палиндром? вярно
Може би, ако тепърва започвате да програмирате, ви е трудно да разберете How работят алгоритмите за обхождане на низове и сравнение. Разбира се, по-добре е да се справите с това, но можете да напишете опростена version на самото преминаване през масива от знаци, което всъщност е низ. Можете да използвате метода StringBuffer.reverse, за да проверите дали даден низ е палиндром. Нека направим най-простата version, без да проверяваме за небуквено-цифрови символи и главни и малки букви.
public class PalindromeTest5 {
public static boolean validPalindrome(String s) {
StringBuffer buffer = new StringBuffer(s);
buffer.reverse();
String data = buffer.toString();
if (s.equals(data)) {
return true;
}
return false;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!";
boolean b1 = validPalindrome(s1);
boolean b2 = validPalindrome(s2);
boolean b3 = validPalindrome(s3);
boolean b4 = validPalindrome(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
Резултатът е същият като в първия пример
нивото палиндром ли е? вярно ли е готиното палиндром? невярно мадам палиндром ли е? false е Сега, сър, войната е спечелена! палиндром? невярно
Ако искате, можете да подобрите тази програма, Howто направихме в първия пример. За да затвърдите наученото, ви предлагаме да гледате видео урок от нашия курс по Java
GO TO FULL VERSION