Last active
August 29, 2015 14:27
-
-
Save WeZZard/67c3dbe3c7ead52d4f8d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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