已有一个由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();
//    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值