zoukankan      html  css  js  c++  java
  • 26 字符串的排列

    题目描述

    输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    输入描述:

    输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

    理解:为什么不加return,因为按照正常的执行流程,for循环三次之后也会退出程序,而if tmp.size == str.size,也是等于sz就退出,所以不加return也是对的。
    如果是无重复元素求全排列,是不是就可以去掉判重的数组visited,for循环里面的if判断是不是就不需要了?
    答:不能去掉,这个版本是通用的,既可以解决无重复的也可以解决有重复元素的全排列问题,如果去掉了for里面的判断,会导致死循环,不断的往里面加第一个元素a,因为程序中每次i都会从0开始
    也就是说每次都会压第一个元素,加上那个去重的判断后,访问过的第一个元素a就会标记为true,会continue。所以以前理解的定义一个start,使得每次递归的时候i = start就是这个原因。
    
    
    class Solution {
    public:
        void helper(string str,vector<string> &res,string &tmp,vector<bool> &visited){
            if(tmp.size() == str.size()){
                res.push_back(tmp);
                //return;
            }
            for(int i = 0;i < str.size();++i){
                if(i != 0 && str[i] == str[i - 1] && (visited[i - 1] == false) || (visited[i] == true)){
                    continue;
                }
                visited[i] = true;
                tmp.push_back(str[i]);
                helper(str,res,tmp,visited);
                tmp.pop_back();
                visited[i] = false;
            }
        }
        vector<string> Permutation(string str) {
            if(str.empty()){
                return {};
            }
            vector<string> res;
            vector<bool> visited(str.size(),false);
            string tmp;
            helper(str,res,tmp,visited);
            return res;
        }
    };
    
    
  • 相关阅读:
    asp.net Core 中间件Hello world
    MVC2 ,MVC3 ,MVC4,MVC5的区别,EF的各个版本的区别;LocalDB是个啥
    EF6 MVC5译文
    发布一个C++版本的ORM库SmartDB
    ORM
    Git图形化界面客户端大汇总
    Model工具
    HTTP协议的8种请求类型介绍
    五大主流数据库模型
    店铺装修——进阶模块介绍
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8027246.html
Copyright © 2011-2022 走看看