1、問題
給你一個字符串 s ,字符串的「能量」定義爲:只包含一種字符的最長非空子字符串的長度。
請你返回字符串的能量。
示例 1:
輸入:s = “leetcode”
輸出:2
解釋:子字符串 “ee” 長度爲 2 ,只包含字符 ‘e’ 。
示例 2:
輸入:s = “abbcccddddeeeeedcba”
輸出:5
解釋:子字符串 “eeeee” 長度爲 5 ,只包含字符 ‘e’ 。
示例 3:
輸入:s = “triplepillooooow”
輸出:5
示例 4:
輸入:s = “hooraaaaaaaaaaay”
輸出:11
示例 5:
輸入:s = “tourist”
輸出:1
提示:
1 <= s.length <= 500
s 只包含小寫英文字母。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/consecutive-characters
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2、思路
這道題是字符串中的子字符串問題。我們可能會想到kmp算法,但是這裏我們不講用kmp算法解決這個問題,別問爲什麼?問就是不會。
第一種方式是常規的解答方式,我們可以用雙層for循環直接給出答案,這個比較方式是冒泡排序的變種,時間複雜度勸退了我們O(n2).
第二種方式就比較厲害了,時間複雜度和空間複雜度都是O(1)。這種方式其實不難理解,如果你經常刷《劍指offer》那麼你對這種方式肯定不陌生。《劍指offer》裏有一道題是求數組最大子序列。這道題解法就是那道題的變種。
3、代碼
talk is cheap show me the code !
(1)第一種方式:
func maxPower(s string) int {
var data []byte = []byte(s)
l := len(data)
count := 1
for i := 0; i < l-1; i++ {
min := 1
for j := i + 1; j < l; j++ {
if data[i] == data[j] {
min++
} else {
break
}
}
if min >= count {
count = min
}
}
return count
}
(2)第二種方式(雙100解法):
func maxPower(s string) int {
var data []byte = []byte(s)
l := len(data)
count := 0
result := 0
start := data[0]
for i := 1; i < l; i++ {
if start == data[i] {
count++
} else {
start = data[i]
count = 0
}
if count > result {
result = count
}
}
return result + 1
}
4、感悟
你以爲寫完思路和代碼就完了嗎?不不不,做這道算法題後,引發了我的主動思考。以前我就在疑惑,學習的真正用處是什麼吶?通過這道題,讓我以小窺大。明白了,學習的真正用處,可能當時沒有辦法立竿見影的看到效果,但是我們學的知識,會在我們記憶深處生根發芽,等到某一時刻,我們需要這部分知識時,它不自覺的冒出來,解決我們遇到的問題,我想這就是學習知識帶來的好處吧。試想,如果我沒有去研究《劍指offer》,沒有對那道求數組最大子序列有很深的印象,那麼做這道題,很有可能只有第一種解法吧。
最後說一句:沒有白走的路,你走的每一條路,命運都會做上標記。加油吧,奧利給!