Skip to content

Latest commit

ย 

History

History
224 lines (177 loc) ยท 5.08 KB

2_String.md

File metadata and controls

224 lines (177 loc) ยท 5.08 KB

String

String Matching

LeetCode 28. Find the Index of the First Occurrence in a String


  • O(n)
  • KMP
    • ์ฐธ๊ณ 
    • ์–ด๋””๊นŒ์ง€ ์ผ์น˜ํ•˜๋Š”์ง€ ์ธ๋ฑ์Šค ์‚ฌ์šฉํ•ด์„œ ํ‘œ์‹œํ•œ๋‹ค.
  • Rolling-Hash
    • sliding window ์‚ฌ์šฉํ•ด์„œ hash ๊ฐ’ ๋น„๊ต
/*
KMP
*/
func strStr(_ haystack: String, _ needle: String) -> Int {
    return KMP(parent: haystack, pattern: needle)
}

func makeTable(_ pattern: String) -> [Int] { 
    let pattern: [Character] = Array(pattern)
    var table: [Int] = Array(repeating: 0, count: pattern.count)
    var j: Int = 0
    for i in 1..<pattern.count { 
        while j > 0 && pattern[i] != pattern[j] { 
            j = table[j - 1]
        }
        if pattern[i] == pattern[j] { 
            j += 1
            table[i] = j
        }
    }
    return table
}

func KMP(parent: String, pattern: String) -> Int { 
    let table: [Int] = makeTable(pattern)
    let parent: [Character] = Array(parent)
    let pattern: [Character] = Array(pattern)
    let parentCount: Int = parent.count
    let patternCount: Int = pattern.count
    var j: Int = 0
    for i in 0..<parentCount { 
        while j > 0 && parent[i] != pattern[j] {
            j = table[j-1]
        }
        if parent[i] == pattern[j] { 
            if j == patternCount - 1 { 
                return i - patternCount + 1
            } else { 
                j += 1
            }
        }
    }
    return -1
}

Palindrome

LeetCode 125. Valid Palindrome


  • 2๊ฐœ์˜ ์ธ๋ฑ์Šค ์‚ฌ์šฉํ•ด์„œ ๋น„๊ต
  • O(n)
func isPalindrome(_ s: String) -> Bool {
    let characters: [Character] = Array(s)
        .filter { $0.isLetter || $0.isNumber }
        .map { Character($0.lowercased()) }

    var left: Int = 0 
    var right: Int = characters.count-1
    while left < right { 
        if characters[left] != characters[right] { return false }
        left += 1
        right -= 1
    }

    return true
}

Add Strings

LeetCode 415. Add Strings


  • 32bit, 64bit์— ๋‹ด์ง€ ๋ชปํ•˜๋Š” ํฐ ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ Int๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ’€ ์ˆ˜ ์—†๋‹ค.
  • carry ์‚ฌ์šฉํ•ด์„œ ์—ฐ์‚ฐ
func addStrings(_ num1: String, _ num2: String) -> String {
    let num1: [Character] = Array(num1)
    let num2: [Character] = Array(num2)
    var idx1: Int = num1.count - 1
    var idx2: Int = num2.count - 1
    var answer: [Character] = []
    var carry: Int = 0

    while idx1 >= 0 && idx2 >= 0 { 
        let sum: Int = Int(String(num1[idx1]))! + Int(String(num2[idx2]))! + carry
        let num: Int = sum % 10
        carry = sum / 10
        answer.append(Character(String(num)))
        idx1 -= 1
        idx2 -= 1
    }

    while idx1 >= 0 { 
        let sum: Int = Int(String(num1[idx1]))! + carry
        let num: Int = sum % 10
        carry = sum / 10
        answer.append(Character(String(num)))
        idx1 -= 1
    }

    while idx2 >= 0 {
        let sum: Int = Int(String(num2[idx2]))! + carry
        let num: Int = sum % 10
        carry = sum / 10
        answer.append(Character(String(num)))
        idx2 -= 1
    }

    if carry != 0 { 
        answer.append(Character(String(carry)))
    }
    
    return String(answer.reversed())
}

Group Anagrams

LeetCode 49. Group Anagrams


  • ์ •๋ ฌํ›„ ํ•ด์‰ฌ ๋งต์— ์ €์žฅ
    • O(nmlgm), O(nm)
  • key๋ฅผ ์•ŒํŒŒ๋ฒณ ๊ฐฏ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ •
    • O(nm)
func groupAnagrams(_ strs: [String]) -> [[String]] {
    guard !strs.isEmpty else { return [] }

    var dict: [String: [String]] = [:]

    for str in strs { 
        let sortedStr: String = String(str.sorted())

        dict[sortedStr, default: []].append(str)
    }

    return Array(dict.values)
}
func groupAnagrams(_ strs: [String]) -> [[String]] {
    Array(
        Dictionary(
            grouping: strs,
            by: { $0.sorted().hashValue }
        )
        .values
    )
}

Longest Substring W/O Repeats

LeetCode 3. Longest Substring Without Repeating Characters


  • ์•ŒํŒŒ๋ฒณ ํ…Œ์ด๋ธ”
  • ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
func lengthOfLongestSubstring(_ s: String) -> Int {
    let s: [Character] = Array(s)
    var checkTable: [Character: Int] = [:]
    var j: Int = 0
    var longest: Int = 0

    for (i, c) in s.enumerated() { 
        if checkTable[c, default: -1] == -1 { 
            checkTable[c] = i
        } else if j <= checkTable[c]! { 
            j = checkTable[c]! + 1 
            checkTable[c] = i
        } else if j > checkTable[c]! {
            checkTable[c] = i
        }
            
        checkTable[c] = i
        longest = max(longest, i - j + 1)
    }
    
    return longest
}



์ฐธ๊ณ