题中说了 数字字符和大小写字符 并且忽略大小写
难点可能就是ASCII码的数值 如果不清楚的 也可以借助这样
func isAlphaNum(_ c:Character) -> Bool {
if c >= "a" && c <= "z" || c >= "0" && c <= "9" {
return true
}
return false
}
所以过滤之后 双指针。。起始位置和结束位置是否相同
func isPalindrome(_ s: String) -> Bool {
let array = Array(s)
var endArray = Array<Character>()
// 48 - 57 0 - 9
// 65 - 90 A - Z
// 97 - 122 a - z
for c in array {
let tempValue = c.asciiValue ?? 0
if (tempValue >= 48 && tempValue <= 57) || (tempValue >= 97 && tempValue <= 122) {
endArray.append(c)
}
else if tempValue >= 65 && tempValue <= 90 {
endArray.append(Character(c.lowercased()))
}
}
var left = 0
var right = endArray.count - 1
while (left < right) && (left < endArray.count) && (right > 0) {
if endArray[left] == endArray[right] {
left += 1
right -= 1
}else {
return false
}
}
return true
}
然后这里是优化的版本
因为可以在左右指针移动的时候判断 可能不用处理完所有的就可以判断出结果 所以
func isPalindrome(_ s: String) -> Bool {
let array = Array(s)
var left = 0
var right = array.count - 1
while (left < right) && (left < array.count) && (right > 0) {
let tempLeft = Character(array[left].lowercased())
let tempRight = Character(array[right].lowercased())
if isAlphaNum(tempLeft) == false {
left += 1
}
else if isAlphaNum(tempRight) == false {
right -= 1
}
else if tempRight == tempLeft {
left += 1
right -= 1
}else {
return false
}
}
return true
}
func isAlphaNum(_ c:Character) -> Bool {
if c >= "a" && c <= "z" || c >= "0" && c <= "9" {
return true
}
return false
}
网友评论