问题描述
给定一个字符串str,给定一个字符串数组arr;
arr里的每一个字符串代表一张贴纸,可以把单个字符剪开使用,
目的是拼出字符串str,求至少需要多少张贴纸可以拼出字符串str。
例:str = "babac",arr = {"ba", "c", "abcd"}
至少需要两张贴纸,分别是“ba”和“abcd”,使用这两张贴纸,把每个字符单独剪开,
有2个a,2个b,1个c,可以拼出babac,所以结果是2。
题解
public class 拼贴纸 {
public static int way1(String str, String[] arr) {
int[][] map = new int[arr.length][26];
for (int i = 0; i < arr.length; i++) {
for (char c : arr[i].toCharArray()) {
map[i][c - 'a'] ++;
}
}
return wayFunc1(str, map);
}
private static int wayFunc1(String rest, int[][] map) {
if ("".equals(rest)) {
return 0;
}
int[] restMap = new int[26];
for (char c : rest.toCharArray()) {
restMap[c - 'a'] ++;
}
int minNext = Integer.MAX_VALUE;
for (int i = 0; i < map.length; i++) {
if (map[i][rest.charAt(0) - 'a'] == 0) {
continue;
}
StringBuilder sb = new StringBuilder();
for (int j = 0; j < 26; j++) {
for (int k = 0; k < restMap[j] - map[i][j]; k++) {
sb.append((char)(j+'a'));
}
}
minNext = Math.min(wayFunc1(sb.toString(), map), minNext);
}
return minNext == Integer.MAX_VALUE ? -1 : (minNext + 1);
}
public static void main(String[] args) {
String str = "abcccccdddddbbbaaaaa";
String[] arr = {"aaaa", "bbaa", "ccddd"};
System.out.println(way1(str, arr));
}
}