1. 程式人生 > >已有一個由26字母中的幾個組成的字串(可出現重複),再插入一個字母,能組成多少種字串

已有一個由26字母中的幾個組成的字串(可出現重複),再插入一個字母,能組成多少種字串

小明有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(); // } }