实现一种算法来确定字符串是否具有所有唯一字符(大于 U+FFFF 的字符)



我正在练习面试问题示例,其中之一是:"实现算法以确定字符串是否具有所有唯一字符"。

当我们假设这是ASCII/ANSI时,这很容易。实现算法以确定字符串是否具有所有唯一字符

但我的问题是:如果假设字符串可以包含例如象形文字符号或其他任何东西(码位大于 U+FFFF...?),应该如何解决这个问题。

因此,如果我理解正确,我可以很容易地想到解决方案,如果给定的字符串包含属于从 U+0000 到 U+FFFF 的字符集的字符 - 它们可以转换为 16 位字符,但是如果我遇到一个字符的代码点大于 U+FFFF...

码位大于 U+FFFF 的字符称为增补字符。Java 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在此表示形式中,增补字符表示为一对字符值,第一个来自高代理项范围 (\uD800-\uDBFF),第二个来自低代理项范围 (\uDC00-\uDFFF)

但是我不知道在这种情况下如何解决这个难题,我如何处理那些代孕对?

谢谢!

Java

8 有一个CharSequence#codePoints方法,该方法在字符串中生成 Unicode 代码点的IntStream。 从那里开始,它就变成了编写代码来测试IntStream中元素的唯一性的问题。

如果您仍在使用 Java 7 或更低版本,那么其中也有基于代码点的方法可用于解决此问题,但它们使用起来要复杂得多。 您必须遍历字符串的char并检查每个值,以判断您是否正在处理代理项对。 类似的东西(完全未经测试):

for (int i = 0; i < str.length(); i++) {
    int codepoint = str.codePointAt(i++);
    if (Character.isHighSurrogate(str.charAt(i))) {
        // This will fail if the UTF-16 representation of 
        // this string is wrong (e.g., high surrogate `char` 
        // at the end of the string's `char[]`).
        i += 1;
    }
    // do stuff with codepoint...
}

最新更新