寫 leetcode 的時候碰到了乙個比較有意思的題目,我栽在了時間複雜度上面
leetcode的567題——字串的排列
題目是這樣的
給定兩個字串s1和s2,寫乙個函式來判斷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。解法一 遞迴實現 從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素...