swift中字符串中的最长前缀子串

问题描述 投票:0回答:1

在 xcode Playground 上检查此代码

我正在尝试从 swift 中的字符串中获取最长的前缀子字符串。 该解决方案有效,但我有一个问题

min 函数没有给我所需的“游泳”作为最短字符串

`
var string = "swimftch swim swimftc swill"

let splitArray = string.split(separator: " ")

var shortestString = string
for singleString in splitArray {
    
    //This works fine - gives "swim" as desired
//    if shortestString.count > singleString.count {
//        shortestString = String(singleString)
//    }
    
    //this does not - gives "swill"
    shortestString = min(String(singleString), shortestString)
    print(shortestString)
}

var isPrefixed = false

func checkSubString() {
    for sub in splitArray {
        if sub.contains(shortestString) {
            print(shortestString)
            isPrefixed = true
        } else {
            isPrefixed = false
        }
    }
    if !isPrefixed {
        shortestString.popLast()
        checkSubString()
    } else {
        print(shortestString)
    }
}


checkSubString()
`

任何人都可以向我解释一下,为什么 min 没有正确返回最短子字符串?

for singleString in splitArray {
    
    //This works fine - gives "swim" as desired
//    if shortestString.count > singleString.count {
//        shortestString = String(singleString)
//    }
    
    //this does not - gives "swill"
    shortestString = min(String(singleString), shortestString)
    print(shortestString)
}
swift string swift-playground longest-prefix
1个回答
0
投票

swift 中的字符串比较不能基于字符数进行比较。 Swift 字符串根据 Unicode 排序算法进行比较,这意味着:

  1. 每个字符串都放入“Unicode规范化形式D”中,
  2. 按字典顺序比较这些“分解”字符串的 unicode 标量值。

这就是为什么

shortestString.count > singleString.count
shortestString > singleString
不会产生相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.