1. 程式人生 > 資訊 >15 點蹲點搶:京東 iPhone 12 4869 元 + 12 期免息

15 點蹲點搶:京東 iPhone 12 4869 元 + 12 期免息

輸入一個字串,打印出該字串中字元的所有排列。

你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。

示例:

輸入: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]
}

目前想到的辦法只能是改為回溯了,從頭開始指定位置。