题解 | #字符串的排列#
字符串的排列
https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
需要注意
- 函数的传参,很多都需要&mut
- String类型转Vec<char> let mut vec_chars: Vec<char> = str.chars().collect();
- Vec<char>转String let ret_str: String = vec_chars.iter().collect();
- 使用hashset来去重
- vec的swap方法用于回溯 vec_chars.swap(start, index);
此外感觉rust在递归上好慢,且占用空间
use std::collections::HashSet; struct Solution; impl Solution { /// 创建 Solution 的新实例 fn new() -> Self { Solution {} } /// 生成字符串所有唯一排列 /// /// # 参数 /// /// * `str` - 输入的字符串 /// /// # 返回 /// /// 包含输入字符串所有唯一排列的向量。 pub fn Permutation(&self, str: String) -> Vec<String> { let mut vec_chars: Vec<char> = str.chars().collect(); let mut ret_set: HashSet<String> = HashSet::new(); // 生成排列 self.permutate(&mut vec_chars, 0, &mut ret_set); // 将 HashSet 转换为 Vec<String> ret_set.into_iter().collect() } /// 递归辅助函数,用于生成排列 /// /// # 参数 /// /// * `vec_chars` - 字符向量的可变引用 /// * `start` - 向量中的当前位置 /// * `ret_set` - 用于存储排列的 HashSet 的可变引用 fn permutate(&self, vec_chars: &mut Vec<char>, start: usize, ret_set: &mut HashSet<String>) { // 如果已经到达字符串的末尾,将向量转换为字符串 if start == vec_chars.len() - 1 { let ret_str: String = vec_chars.iter().collect(); // 将排列插入 HashSet 以确保唯一性 ret_set.insert(ret_str); return; } // 通过交换字符递归生成排列 for index in start..vec_chars.len() { vec_chars.swap(start, index); self.permutate(vec_chars, start + 1, ret_set); vec_chars.swap(start, index); } } }#rust#