public List<List<String>> partition(String s) { int len = s.length(); List<List<String>> totalList = new ArrayList<>(); if(len == 0){ return totalList; } boolean[][] dp = new boolean[len][len]; for(int i = 0;i<len;i++){ for(int j = 0;j<=i;j++){ if(s.charAt(i)==s.charAt(j) && (Math.abs(i-j)<=2 || dp[j+1][i-1])){ dp[j][i] = true; } } } List<String> list = new ArrayList<>(); partition(s,0,list,totalList,dp); return totalList; } private void partition(String s, int start,List<String> list,List<List<String>> totalList , boolean[][] dp) { if(start == s.length()){ totalList.add(new ArrayList<>(list)); //对list进行备份 return; } for(int m = start;m<s.length();m++){ if(dp[start][m]){ list.add(s.substring(start,m+1)); partition(s,m+1,list,totalList,dp); list.remove(list.size()-1); } } }
totalList.add(new ArrayList<>(list)); //对list进行备份
这点要记得,不进行拷贝的话,答案是不对的。
——2020.6.28