Skip to content

Instantly share code, notes, and snippets.

@WeZZard
Last active August 29, 2015 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WeZZard/67c3dbe3c7ead52d4f8d to your computer and use it in GitHub Desktop.
Save WeZZard/67c3dbe3c7ead52d4f8d to your computer and use it in GitHub Desktop.
let string = "XCVBNMDFGHJRTYUERTYUSDFZDFWEDFASDASWE"
string.characters.count
let targetString = "ASWE"
targetString.characters.count
private class Substring {
var range: Range<String.Index>
var content: String
var matched: Bool?
init(content: String, range: Range<String.Index>) {
self.content = content
self.range = range
}
}
func findString(targetString: String, inString containerString: String) -> [Range<String.Index>] {
var substrings = [Substring]()
let targetCount = targetString.characters.count
let characterCount = containerString.characters.count
guard targetCount > 0 && targetCount <= characterCount else {
return []
}
for (index, eachContained) in containerString.characters.enumerate() {
let characterIndex = advance(string.startIndex, index)
for eachSubstring in substrings
where eachSubstring.matched == nil
{
let indexInTargetString = advance(targetString.startIndex, eachSubstring.content.characters.count)
if indexInTargetString < targetString.endIndex {
let characterInTargetString = targetString[indexInTargetString]
if eachContained == characterInTargetString {
eachSubstring.content.append(eachContained)
eachSubstring.range.endIndex = eachSubstring.range.endIndex.successor()
if eachSubstring.content.endIndex == targetString.endIndex {
eachSubstring.matched = true
}
} else {
eachSubstring.matched = false
}
} else {
eachSubstring.matched = false
}
}
if eachContained == targetString[targetString.startIndex] {
let substring = Substring(content: String(eachContained), range: characterIndex...characterIndex)
substrings.append(substring)
}
}
return substrings.filter({$0.matched == true}).map({$0.range})
}
let ranges = findString(targetString, inString: string)
for each in ranges {
print(string[each])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment