小明有26种游戏海报,用小写字母a-z表示,小明会把游戏海报装订成册(可能有重复的海报),册子可以用一个字符串来表示,每个字符就表示对应的海报,例如abcdea,小明现在想做一些“特别版”,然后卖掉,特别版就是会从所有海报(26种)中随机选一张,加入到册子的任意一个位置。
那现在小明手里已经有一种海报册子,再插入一张新的海报后,他一共可以组成多少不同的海报册子呢?
代码没有在OJ测过,不知道能不能达到100%
import com.sun.deploy.util.StringUtils;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class StringDistinct {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.next();
int strLen = str.length();
// int strDistinctLen = strDistinctLen(str);
String strOrderDistinct = stringOrderDistinctLen(str);
int strOrderDistinctLen = strOrderDistinct.length();
//先计算字符串中未出现的字母个数,直接插入到算上头尾一共str.length() + 1个可能
int finalResult = (26 - strOrderDistinctLen) * (strLen + 1);
//循环已出现的、去重后的字母,计算把这个字母去掉后的字符串插入这个字母的可能性
for (int x = 0; x < strOrderDistinctLen; x++) {
finalResult += (str.replaceAll(String.valueOf(strOrderDistinct.charAt(x)), "").length() + 1);
}
System.out.println(finalResult);
}
}
//字符串整体去重
private static String stringOrderDistinctLen(String str) {
Set<String> list = new HashSet<String>();
for (int x = 0; x < str.length(); x++) {
list.add(String.valueOf(str.charAt(x)));
}
return StringUtils.join(list, "");
}
//相邻字符串去重,和这题没关系,开始想错了,也算是一个算法了
// public static int strDistinctLen(String str) {
// List<String> list = new ArrayList<String>();
// for (int i = 0; i < str.length(); i++) {
// list.add(str.charAt(i) + "");// 这里就是使用字符串存入到list中,
// }
// for (int m = 0; m < list.size() - 1; m++) {
// if (list.get(m).equals(list.get(m + 1))) {
// list.remove(m + 1);
// m--;
// }
// }
// StringBuffer sb = new StringBuffer();
// String str3 = "";
// for (int j = 0; j < list.size(); j++) {
// str3 = sb.append(list.get(j)).toString();
// }
// return str3.length();
// }
}