- 题目:
- 代码:
public class text2 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int i = numTilePossibilities(sc.nextLine()); System.out.println(i); } public static int numTilePossibilities(String tiles) { Map<Integer, Set<String>> map = new HashMap<>(); Set<String> set = new HashSet<>(); //使用HashSet存储每个字符,根据HashSet的特点按照字符顺序排序,且元素不重复 for (int i = 0;i < tiles.length();i++) { //将字符插入到HashSet中 set.add(String.valueOf(tiles.charAt(i))); } //将set存入HashMap中 map.put(1,set); for (int i = 2;i <= tiles.length();i++) { //其实是存入的是base,刚开始存入的是单个字符,之后依次增加 Set<String> lastSet = map.get(i - 1); Set<String> curSet = new HashSet<>(); //整个遍历是从小字符串到大字符串 //里边存的是每一组字符串,第一次是单个字符的set组,第二次是两个字符的set组,依次类推 for (String lstr : lastSet) { for (String rstr : set) { //将字符与字符拼接成字符串 String add = new String(lstr + rstr); //判断字符串是否合格 if (judge(add,tiles)) { //用来存放新没有重复的字符串 curSet.add(add); } } } //将新字符串存入map集合中 map.put(i,curSet); } int ans = 0; for (int i = 1;i <= tiles.length();i++) { ans += map.get(i).size(); } return ans; } private static boolean judge(String add,String tiles) { //用来存储要添加的字符串中在26个字母中某个字母的个数 int sa[] = new int[26]; for (int i = 0;i < add.length();i++) { sa[add.charAt(i) - 'A']++; } //用来存储输入的字符串中在26个字母中某个字母的个数 int ra[] = new int[26]; for (int i = 0;i < tiles.length();i++) { ra[tiles.charAt(i) - 'A']++; } //排列组合后的结果中的字符不能超过原有字模中的字符 for (int i = 0;i < sa.length;i++) { if (sa[i] > ra[i]) { return false; } } return true; } }
- 实例:
Java实现:LeetCode活字印刷
最新推荐文章于 2023-05-19 15:23:42 发布