其實我的演算法並不是強項,然後今天在做438這道題的時候發現了乙個讓我無比佩服的思路,這裡記錄一下和大家分享:
首先看一下題目:
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。
字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。
說明:字母異位詞指字母相同,但排列不同的字串。
不考慮答案輸出的順序。
首先說說我的思路(時間沒過,沒興趣的可以跳過,直接看大神解法)
**:
public list
findanagrams1
(string s, string p)
else
} bitmap.
putall
(charmap)
;int marker_=p.
length()
; marker = p.
length()
;while
(right < s.
length()
)else
elseif(
!charmap.
containskey
(integer.
valueof
(s.charat
(right)))
)else
else}}
else}}
}return res;
}
其實我自己在寫的時候就覺得有些冗雜和煩瑣了,當然我一般還會花時間去優化一下,但也是因為這次比較著急,直接看到了大神的解法,讓我自己琢磨和學習了很久。
直接上**:
public list
findanagrams
(string s, string p)
else
else}if
(conter == plength)
}return result;
}
這裡其實沒有它的思路,然後我自己研究了一下,這裡做一下總結。
首先,我得說,是我自己陷入了固定的滑動視窗解體的套路當中,當然對於一些題目來說,滑動視窗是非常有效率的,但是不應該只是知道了滑動視窗就限制了自己的思路。
作者宣告了
int slength = s.length();
int plength = p.length();
int conter = 0;
stringbuilder sb = new stringbuilder§;
list result = new arraylist();
前兩個不用多說了,分別是長度。然後conter是記錄的當前已經掃瞄到了幾個屬於p串的字元。定義p的sb是為了記錄當前已經有哪些字元已經在s中找到了,找到了就把把它從sb中刪掉,那麼剩下的就是還沒有匹配到的。
result就是記錄結果了。
for ch in str.s
}
大家共勉~~
Leetcode438 找到字串中所有字母異位詞
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...
438 找到字串中所有字母異位詞
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...
438 找到字串中所有字母異位詞
給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...