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

    输入一个字符串,打印出该字符串中字符的所有排列。

    你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

    示例:

    输入:s = "abc"
    输出:["abc","acb","bac","bca","cab","cba"]
    

    限制:

    1 <= s 的长度 <= 8

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof

    解题思路

    一个很重要的思想:如果我们不知道循环多少层去解决问题的话,就可以使用递归的思想去解决。相比于回溯算法,我的思想跟回溯算法是相反的。回溯算法是从头开始指定位置填写相应值,也就是说在递归的时候第i个位置应该填写a。而我的想法是:从尾开始指定填写相应的值。这样说可能很复杂,下面我画个图:

    还有因为题目说不能有重复。这里的解决办法是:为了确保相同的字符串传入同一目标位置的动作只发生一次,对原先的字符串进行排序,也就是将相同的大小的值放在一起。对同一个位置进行选择的时候,判断一下当i>0是,s[i-1]是否等于s[i]

    代码

    func permutation(s string) []string {
    	result := make([]string,len(s))
    	for i:=0;i<len(s);i++{
    		result[i] = string(s[i])
    	}
    	sort.Strings(result)
    	s = ""
    	for i:=0;i<len(result);i++{
    		s += result[i]
    	}
    	return dfs(s)
    }
    
    func dfs(s string)[]string{
    	if len(s)==1{
    		return []string{s}
    	}
    	result := make([]string,0)
    	for i:=0;i<len(s);i++{
    		if i>0 && s[i]==s[i-1]{
    			continue
    		}
    		tmpS := s[:i] + s[i+1:]
    		tmp := dfs(tmpS)
    		for j:=0;j<len(tmp);j++{
    			tmp[j] = string(s[i]) + tmp[j]
    		}
    		result = append(result,tmp...)
    	}
    	return result
    }
    

    这个思路还有一个需要优化的地方就是:每一次递归函数返回的时候都需要:

    tmp := dfs(tmpS)
    for j:=0;j<len(tmp);j++{
    	tmp[j] = string(s[i]) + tmp[j]
    }
    

    目前想到的办法只能是改为回溯了,从头开始指定位置。

  • 相关阅读:
    Keepalived安装使用详解
    Django缓存使用方法
    Django常用命令及参数配置(Django 1.8.6)
    Python之Rpyc模块
    Hadoop:实战Web日志分析
    Hadoop:使用Mrjob框架编写MapReduce
    Hadoop:使用原生python编写MapReduce
    Hadoop安装
    LGOJP1850 换教室
    BZOJ4318: OSU!
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/14920614.html
Copyright © 2011-2022 走看看