演算法 字串的排列

2021-09-19 01:25:46 字數 1514 閱讀 8986

寫 leetcode 的時候碰到了乙個比較有意思的題目,我栽在了時間複雜度上面

leetcode的567題——字串的排列

題目是這樣的

給定兩個字串s1s2,寫乙個函式來判斷s2是否包含s1的排列。

換句話說,第乙個字串的排列之一是第二個字串的子串

例項:

輸入: s1 = "ab" s2 = "eidbaooo"

輸出: true

解釋: s2 包含 s1 的排列之一 ("ba").

輸入: s1= "ab" s2 = "eidboaoo"

輸出: false

注意:

輸入的字串只包含小寫字母

兩個字串的長度都在 [1, 10,000] 之間

最開始我就是直接把s1每一種的情況都列出來,然後一一的用indexof的方法判斷是否存在在s2裡面,解法是這樣的

每一次把乙個字元放在最前面,讓後面的字元遞迴的放在最前面,每一次的索引是不一樣的,也就是 i 是不一樣的,想不出來的同學可以用abc來直觀的感受一下

應該是abc,acb,bac,bca,cba,cab這樣的排列順序

boolean flag = false;

public boolean checkinclusion(string s1, string s2)

private void check(char array, string s2, int start, int end) else }}

private void swap(char array, int m, int n)

我們會發現時間複雜度為o(n!),而空間複雜度為 o(n^2)。然後就超出了時間的限制

然後我去找leetcode大神的解法,發現了乙個很好的解法,只需要 o(n)的時間複雜度

我們可以將 s1 的字元放入到乙個陣列裡面去,然後讓這個陣列在 s2 上面滑動,s1 有的字元就加一,s2有的字元就減一,滑到某個位置時如果發現 s1 有的字元 s2的滑動視窗裡面全部都有,那麼陣列裡面的值會全部為0

public boolean checkinclusion(string s1, string s2) 

if (check(array)) return true;

for (int i = len1; i < len2; i++)

return false;

}public boolean check(int array)

return true;

}

字串全排列演算法

輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba 這是典型的遞迴求解問題,遞迴演算法有四個特性 對於字串的排列問題 如果能生成n 1個元素的全排列,就能生成n個元素的全排列。對於只有乙個元素的集...

演算法 字串全排列演算法

最近在牛客和領扣上刷題,碰到了一些全排列的問題,總結一下。我們首先來看乙個問題?題目 字串的排列 題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。解題思路 使用遞迴的方式來...

演算法 字串的全排列

from 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c 所能排列出來的所有字串 abc acb bac bca cab 和 cba。解法一 遞迴實現 從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素...