生活随笔
收集整理的這篇文章主要介紹了
子串字谜substring anagrams
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
[抄題]:
給定一個字符串?s?和一個?非空字符串?p?,找到在?s?中所有關(guān)于?p?的字謎的起始索引。
字符串僅由小寫英文字母組成,字符串?s?和?p?的長度不得大于 40,000。
輸出順序無關(guān)緊要.
樣例
給出字符串 s =?"cbaebabacd"?p =?"abc"
返回?[0, 6]
子串起始索引 index = 0 是 "cba",是"abc"的字謎.
子串起始索引 index = 6 是 "bac",是"abc"的字謎.
?[暴力解法]:
時間分析:
空間分析:
[思維問題]:
[一句話思路]:
先初始化,再統(tǒng)計p位之后的絕對值之和。
[輸入量]:空:?正常情況:特大:特小:程序里處理到的特殊情況:異常情況(不合法不合理的輸入):
[畫圖]:
sliding window的原理是數(shù)數(shù)字,向右滑動時,count(r)++,count(l)--
[一刷]:
字符串處理一個個的字母時,要用.tochararray先把字符串轉(zhuǎn)成數(shù)組det也是數(shù)組,absSum是其的絕對值求和det 有幾個元素算幾個,用for (int item : det)簡寫s.toCharArray();表示對方法的調(diào)用list一定要用linkedlist or arraylist來實現(xiàn),不能直接復(fù)制粘貼[二刷]:
特殊判斷必須要寫搞清楚det的含義 = sc - pc pc增加,det = r - l r增加在之后的數(shù)組中,都是計算cntS[] 數(shù)組的數(shù)量absSum要用Math.abs[三刷]:
[四刷]:
[五刷]:
? [五分鐘肉眼debug的結(jié)果]:
[總結(jié)]:
根據(jù)表格進行聯(lián)想
[復(fù)雜度]:Time complexity: O(n) Space complexity: O(n)
[英文數(shù)據(jù)結(jié)構(gòu)或算法,為什么不用別的數(shù)據(jù)結(jié)構(gòu)或算法]:
[其他解法]:
[Follow Up]:
[LC給出的題目變變變]:
242.?Valid Anagram 用deta求absSum
567.?Permutation in String 兩根指針?不懂
?[代碼風格] :
cntS 才符合駱駝命名法 public class Solution {/*** @param s: a string* @param p: a string* @return: a list of index*/public List<Integer>
findAnagrams(String s, String p) {//initializationList<Integer> ans =
new LinkedList<>
();//corner caseif (s.length() <
p.length()) {return ans;}char[] sc =
s.toCharArray();char[] pc =
p.toCharArray();int[] cntS =
new int[256
];int[] cntP =
new int[256
];int[] det =
new int[256
];//count firstint absSum = 0
;for (
int i = 0; i < p.length(); i++
) {cntS[sc[i]]++
;cntP[pc[i]]++
;det[sc[i]]++
;det[pc[i]]--
;}for (
int item : det) {absSum +=
Math.abs(item);}if (absSum == 0
) {ans.add(0
);}//count restfor (
int i = p.length(); i < s.length(); i++
) {int r =
sc[i];int l = sc[i -
p.length()];System.out.println("sc[i]="+
sc[i]);System.out.println("r="+
r);cntS[r]++;
//both scntS[l]--
;absSum = absSum - Math.abs(det[r]) - Math.abs(det[l]);
//abs
det[l]--
;det[r]++
;absSum = absSum + Math.abs(det[r]) +
Math.abs(det[l]);if (absSum == 0
) {ans.add(i - p.length() + 1
);}}return ans;}
} View Code ?
轉(zhuǎn)載于:https://www.cnblogs.com/immiao0319/p/8450432.html
總結(jié)
以上是生活随笔為你收集整理的子串字谜substring anagrams的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。