본문 바로가기
Xcode/Swift - Algorithm

Swift) LeetCode(Easy) - Valid Palindrome (String)

by 후르륵짭짭 2020. 8. 29.
728x90
반응형

leetcode.com/problems/valid-palindrome/

 

Valid Palindrome - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

안녕하세요 후르륵짭짭 입니다.

요즘에는 알고리즘만 포스팅 하고 있는데,,, 그럴만한 사정이 있어서 ㅠㅠ

문제는 진짜 간단하고 쉽습니다.

 

** 문제 내용 **

alphanumeric = 영숫자 만 고려해서 이 문자가 팰린드롬인지 확인 하는 문제 입니다.

 

** 해결 방법 **

저는 저번에 공부 했던 정규식을 이용해서 풀었습니다.

class Solution {
    
    func returnStringByRex(pattern : String , word : String) -> [String] {
        
        do {
            let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
            
            let result = regex.matches(in: word, options: [], range: NSRange(location: 0, length: word.count))
            
            let rexStrings = result.map { (element) -> String in
                
                let range = Range(element.range, in: word)!
                
                return String(word[range])
                
            }
            
            return rexStrings
        } catch let error {
            print(error.localizedDescription)
        }
        
        return []
        
    }
    
    func isPalindrome(_ s: String) -> Bool {
                
        let validString = returnStringByRex(pattern: "[a-z0-9]+", word: s.lowercased()).joined().map { (char) -> String in
            return String(char)
        }
        
        print(validString)
        var start = 0
        var end = validString.count - 1
        
        
        while start < end {
            
            if validString[start] != validString[end] {
                return false
            }
            
            start += 1
            end -= 1
        }
        
        return true
    }
    
}

이렇게 해서 저번에도 팰린드롬을 해서 빨리 풀 수 있었습니다.

이렇개 해서 풀었는데, 이번에는 다른 사람의 코드를 보도록 하겠습니다.

 

** 다른 사람의 코드 **

cool_shark

class Solution {
    func isPalindrome(_ s: String) -> Bool {
        var i = 0, j = s.count - 1
        let arr = Array(s.lowercased())
        while i < j {
            while i < j && !arr[i].isAlphaNumeric {
                i += 1
            }
            while i < j && !arr[j].isAlphaNumeric {
                j -= 1
            }
            guard arr[i] == arr[j] else {
                return false
            }
            i += 1
            j -= 1
        }
        return true
    }
}

extension Character {
    var isAlphaNumeric: Bool {
        return isLetter || isNumber
    }
}

여기서 새롭게 알게 된 사실은 Chatacter 형은 이 문자가 

문자인지 (isLetter) / 숫자인지 (isNumber) / 아스키코드인지 (isASCII) 등

여러가지를 확인 할 수 있습니다!

728x90
반응형

댓글