lintcode10- String Permutation II- medium
Posted jasminemzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode10- String Permutation II- medium相关的知识,希望对你有一定的参考价值。
Given a string, find all permutations of it without duplicates.
Example
Given "abb"
, return ["abb", "bab", "bba"]
.
Given "aabb"
, return ["aabb", "abab", "baba", "bbaa", "abba", "baab"]
.
函数头:public List<String> stringPermutation2(String str)
算法:DFS。和排列数字差不多,只是操作对象变了。private void dfs(char[] chars, boolean[] isUsed, StringBuilder sb, List<String> result) 。排序,递归函数。每次试着加一个字母,标记被用过,再递归。为了去重记得要求如果前后两个char一样,而且前面老大没被用过,那你就不能被加。
细节:1.stringBuilder.deleteCharAT(idx) 可以去除某一位的char(切记是delete不是remove!更有操作小东西的感觉)。2.stringBuilder.length() 直接就是它当前包含的字符串的char数。3.stringBuilder.toString()相当于deepcopy,放心,你这时候照的相不会受之后sb变动而改变。4.初始化数组也要加new关键词啊 int[] a = new int[5]。要是没有new那还以为你在引用呢。
public class Solution { /* * @param str: A string * @return: all permutations */ public List<String> stringPermutation2(String str) { // write your code here List<String> result = new ArrayList<>(); if (str == null) { return result; } char[] chars = str.toCharArray(); boolean[] isUsed = new boolean[chars.length]; // 一定要排序哦 Arrays.sort(chars); dfs(chars, isUsed, new StringBuilder(), result); return result; } private void dfs(char[] chars, boolean[] isUsed, StringBuilder sb, List<String> result) { if (sb.length() == chars.length) { result.add(sb.toString()); return; } for (int i = 0; i < chars.length; i++) { if (isUsed[i]) { continue; } if (i > 0 && chars[i] == chars[i - 1] && !isUsed[i - 1]) { continue; } sb.append(chars[i]); isUsed[i] = true; dfs(chars, isUsed, sb, result); isUsed[i] = false; sb.deleteCharAt(sb.length() - 1); } } }
以上是关于lintcode10- String Permutation II- medium的主要内容,如果未能解决你的问题,请参考以下文章
lintcode-medium-Interleaving String
Lintcode29 Interleaving String solution 题解