LeetCode1446. 連續字符

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》,沒有對那道求數組最大子序列有很深的印象,那麼做這道題,很有可能只有第一種解法吧。
最後說一句:沒有白走的路,你走的每一條路,命運都會做上標記。加油吧,奧利給!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章