当前位置: 面试刷题>> 字符串的不同排列 (经典算法题500道)


### 题目描述 **题目**:给定一个字符串`s`,请编写一个函数来生成该字符串的所有不同排列,并以列表的形式返回这些排列。注意,结果中的排列顺序不重要,但每个排列中的字符顺序必须保持原字符串中的相对顺序。 ### 示例 **输入**:`s = "abc"` **输出**:`["abc", "acb", "bac", "bca", "cab", "cba"]` ### 解答 下面分别给出PHP、Python和JavaScript的示例代码: #### PHP 示例 ```php function permuteUnique($s) { $result = []; $strArr = str_split($s); sort($strArr); // 排序,为了后续去重 $used = array_fill(0, count($strArr), false); backtrack($strArr, $used, '', $result); return $result; } function backtrack(&$strArr, &$used, $current, &$result) { if (strlen($current) == count($strArr)) { $result[] = $current; return; } for ($i = 0; $i < count($strArr); $i++) { // 跳过重复字符和已使用的字符 if ($i > 0 && $strArr[$i] == $strArr[$i-1] && !$used[$i-1]) { continue; } if (!$used[$i]) { $used[$i] = true; backtrack($strArr, $used, $current . $strArr[$i], $result); $used[$i] = false; } } } // 测试 $s = "abc"; $output = permuteUnique($s); print_r($output); ``` #### Python 示例 ```python def permuteUnique(s): def backtrack(first=0): if first == n: output.append(''.join(s)) for i in range(first, n): # 避免产生重复的排列 if i > first and s[i] == s[first]: continue s[first], s[i] = s[i], s[first] backtrack(first + 1) s[first], s[i] = s[i], s[first] s = sorted(s) n = len(s) output = [] backtrack() return output # 测试 s = "abc" print(permuteUnique(s)) ``` #### JavaScript 示例 ```javascript function permuteUnique(s) { const result = []; const strArr = s.split(''); strArr.sort((a, b) => a.localeCompare(b)); // 排序,用于去重 const used = new Array(strArr.length).fill(false); function backtrack(first = 0) { if (first === strArr.length) { result.push(strArr.join('')); return; } for (let i = first; i < strArr.length; i++) { // 跳过重复和已使用的字符 if (i > first && strArr[i] === strArr[first] && !used[first]) continue; if (!used[i]) { [strArr[first], strArr[i]] = [strArr[i], strArr[first]]; used[i] = true; backtrack(first + 1); used[i] = false; [strArr[first], strArr[i]] = [strArr[i], strArr[first]]; } } } backtrack(); return result; } // 测试 const s = "abc"; console.log(permuteUnique(s)); ``` **码小课网站中有更多相关内容分享给大家学习**,可以探索更多算法和数据结构的知识。
推荐面试题