回文词 Palindrome,UVa 401《算法竞赛入门经典》(Java语言)
程序员文章站
2022-03-13 20:50:42
...
《算法竞赛入门经典》P48
输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓 回文串,就是反转以后和原串相同,如abba和madam。所有镜像串,就是左右镜像之后和原
串相同,如2S和3AIAE。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题 中,每个字符的镜像如图3-3所示(空白项表示该字符镜像后不能得到一个合法字符)。
输入的每行包含一个字符串(保证只有上述字符。不含空白字符),判断它是否为回文 串和镜像串(共4种组合)。每组数据之后输出一个空行。
样例输入:
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出:
NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.
还是使用常量串的问题。另外,在Virtual Judge上提交时,由于没有注意样例输出的格式,导致多次WA,需要注意。
import java.util.Scanner;
public class Main {
private static int getIndex(char c)
{//返回在镜像串常量数组中对应的下标
if(c>='A'&&c<='Z')
{
return (c-'A');
}else
{
return (c-'0'+25);
}
}
public static void main(String[] args) {
String mir="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
String[] answer={" -- is not a palindrome."," -- is a regular palindrome.",
" -- is a mirrored string."," -- is a mirrored palindrome."};
Scanner in=new Scanner(System.in);
while(in.hasNextLine())
{
boolean isMirrored=true,isPalindrome=true;//每循环一次重新定义一次标志量,防止前一次的结果对其造成影响
String input=in.nextLine();
for(int i=0;i<(input.length()/2)+1;i++)
{
if(input.charAt(i)!=input.charAt(input.length()-1-i))
{
//System.out.println(input.charAt(i)+","+input.charAt(input.length()-1-i));
isPalindrome=false;
}
if(mir.charAt(getIndex(input.charAt(i)))!=input.charAt(input.length()-1-i))//当第i个字母的镜像字与对称的那个字母不相等时
{
//System.out.println(mir.charAt(getIndex(input.charAt(i)))+","+input.charAt(input.length()-1-i));
isMirrored=false;
}
}
System.out.print(input);
if(!isMirrored&&!isPalindrome)
{
System.out.println(answer[0]);
}else if(!isMirrored&&isPalindrome)
{
System.out.println(answer[1]);
}else if(isMirrored&&!isPalindrome)
{
System.out.println(answer[2]);
}
else
{
System.out.println(answer[3]);
}
System.out.println();
}
in.close();
}
}