已有一個由26字母中的幾個組成的字串(可出現重複),再插入一個字母,能組成多少種字串
阿新 • • 發佈:2019-02-02
小明有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();
// }
}