题解 | #字符串的排列#

字符串的排列

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=295&tqId=23291&ru=%2Fpractice%2F0c9664d1554e466aa107d899418e814e&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295

这道题的解法和 #有重复项的数组全排列# 一模一样。。。

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串vector
     */
    vector<string> Permutation(string str) {
      if (str.empty()) {
        return std::vector<std::string>();
      }
      std::string tmp;
      std::vector<std::string> res;
      std::vector<int> visited(str.size(), 0);
      
      std::sort(str.begin(), str.end());
      
      recursion(res, str, tmp, visited);
      
      return res;
    }
  private:
    void recursion(std::vector<std::string> &res, std::string &str, std::string &tmp, std::vector<int> &visited) {
      if (tmp.size() == str.size()) {
        res.push_back(tmp);
        return ;
      }
      
      for (int i = 0; i < str.size(); ++i) {
        if (visited[i]) {
          continue;
        }
        //  这一步判断的前提是,序列已经是有序的
        if (i > 0 && str[i] == str[i - 1] && !visited[i - 1]) {
          continue;
        }
        
        visited[i] = 1;
        tmp.push_back(str[i]);
        recursion(res, str, tmp, visited);
        tmp.pop_back();
        visited[i] = 0;
      }
    }
};
全部评论

相关推荐

有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务