题面描述:
有两个长度相同的字符串,均由字母A-Z构成,长度不超过100。请判断是否可以把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。
如JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后把每个字母映射到它前一个字母(B->A, C->B, …, Z->Y, A->Z),得到VICTORIOUS。
输入:
两行字符串。
输出:
若可以请输出两行,第一行为YES,第二行为对应的一个映射。否则输出NO。
示例输入:
ABBCFEA
CCGGHJB
示例输出:
YES
A->C B->G C->H F->J E->B
代码:
package a;
import java.util.Scanner;
public class Main {
public static String removeMethod(String s) {
StringBuffer sb = new StringBuffer();
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (s.indexOf(c) == s.lastIndexOf(c)) {
sb.append(c);
} else {
int fristposition = s.indexOf(c);
if (fristposition == i) {
sb.append(c);
}
}
}
return String.valueOf(sb);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String x = in.nextLine();
int a = x.length();
int arr1[] = new int[26];
String y = in.nextLine();
int arr2[] = new int[26];
for(int i = 0; i < a; i++) {
arr1[x.charAt(i) - 'A']++;
arr2[y.charAt(i) - 'A']++;
}
int arr3[] = new int[26];
for(int i = 0; i < a; i++) {
if(arr1[x.charAt(i) - 'A'] != -1) {
for(int j = 0; j < 26; j++) {
if(arr2[j] == arr1[x.charAt(i) - 'A']) {
arr1[x.charAt(i) - 'A'] = -1;
arr2[j] = -1;
arr3[j] = x.charAt(i) - 'A';
break;
}
}
}
if(arr1[x.charAt(i) - 'A'] != -1) {
System.out.println("NO");
System.exit(0);
}
}
System.out.println("YES");
String removeX = removeMethod(x);
String removeY = removeMethod(y);
for (int i = 0; i <removeX.length()-1 ; i++) {
System.out.print(removeX.charAt(i)+"->"+removeY.charAt(i)+" ");
}
System.out.println(removeX.charAt(removeX.length()-1)+"->"+removeY.charAt(removeY.length()-1));
in.close();
}
}