我來自 Java 背景,String在 swift 中切片對我來說顯得非常冗長和困難。我正在嘗試用一種適用于下標的演算法來回答這個 leet 代碼問題。
給定一個字串 s,找出最長子串的長度,沒有重復字符。
輸入:s = "abcabcbb"
輸出:3
解釋:答案是“abc”,長度為 3。
這是我的代碼:
func lengthOfLongestSubstring(_ s: String) -> Int {
var maximum = 0
var start = 0
var end = 0
var set = Set<Character>()
while end < s.count{
if set.contains(s[end]){
set.remove(s[start])
start =1
}
else{
set.insert(s[end])
end =1
maximum = max(maximum, end-start)
}
}
}
我使用 Int 下標。但我收到此錯誤訊息:'subscript(_:)' is unavailable: cannot subscript String with an Int, use a String.Index instead. 我怎樣才能解決它而不會太冗長?
uj5u.com熱心網友回復:
其他語言對 Unicode 字串進行了簡化假設,而 Swift 則沒有。你不能確定一個給定的字符需要多少個代碼點來存盤,所以每次你索引到一個 unicode 字串的第 n 個字符時,它都是一個O(n)操作。出于這個原因,Swift 不提供整數索引。
正如馬特在他的評論中所建議的那樣,將整數索引到 Swift 字串的字符中的簡單方法是將字串轉換為字符陣列。
或者,您可以學習如何使用 a 對 Swift 字串進行索引String.Index,但這需要您更改當前的方法。
uj5u.com熱心網友回復:
訪問字串中的字符
如果字串由固定大小的字符組成,這些字符確實以固定大小存盤,那么查找第 n 個字符將是直接而有效的。
但是具有不同字串編碼的下標是另一回事,尤其是在使用可變長度字符的情況下,例如在 UTF-8 中:一些字符被編碼在幾個位元組上。因此,直接訪問第 n 個字符將需要從字串的開頭一個一個地計算字符(耗時)或構建一個將字符編號映射到位元組位置的索引(占用空間)。
另一方面,演算法(包括你的)經常一個接一個地訪問字符。如果您可以使用相對位置,則無需從頭開始重新計算字符。出于這個原因,Swift 設計者選擇使用索引為字串添加下標。
快速解決
由于下標需要一個索引并且您使用整數,因此快速修復只是將一個轉換為另一個。要消除錯誤,您可以簡單地將整數轉換為索引,將錯誤替換為s[i]:
s[s.index(s.startIndex, offsetBy: i))]
這不是很簡潔。但它的優點是需要從整數位置計算索引的次優方法引起您的注意。
適應新方式
另一種方法是使用本機方式并使用索引而不是整數并迭代字串:
func lengthOfLongestSubstring(_ s: String) -> Int {
var maximum = 0
var start = s.startIndex // starting at start of the string
var end = s.startIndex
var set = Set<Character>()
while end != s.endIndex{ // is end of string reached ?
if set.contains(s[end]){
set.remove(s[start])
start = s.index(after: start) // going to the next character
}
else{
set.insert(s[end])
end = s.index(after:end) // going to the next character
maximum = max(maximum, s.distance(from: start, to:end)) // count characters between indexes
}
}
return maximum
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399931.html
上一篇:理解Swift中的布局錨點
