字符串唯一字符

时间:2010-04-07 02:20:25

标签: string

实施算法以确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办?

9 个答案:

答案 0 :(得分:6)

如果你可以使用一点辅助内存,那么你需要的是一小部分位(用字符的数字代码索引)(如果你的字符是4字节的Unicode字符,你可能需要一个hashmap代替;-)。从0处的所有位开始:从开始扫描字符串 - 每次,如果与当前字符对应的位已经为1,则发现重复 - 否则,没有重复,将该位设置为1。是O(N)。

如果你不能分配任何额外的内存,但可以改变字符串,那么对字符串进行排序,然后执行传递以检查相邻的重复项是最好的,O(N log N)。

如果你不能分配额外的内存并且不能改变字符串,你需要一个O(N平方)检查,检查每个字符与以下所有字符。

答案 1 :(得分:2)

我们可以通过为每个字符分配一个素数来实现它...并将其与每个找到的字符相乘。然后在每个字符上检查该值是否可以被分配给该字符的数字整除..

答案 2 :(得分:2)

在c程序中回答

int is_uniq(char *str) 
{
    int i = 0, flag = 0, value = 0;
    for(i = 0; i < strlen(str); i++) {
        value = str[i] - 'a';
        if(flag & (1 << value)) {
            return 0;
        }
        flag |= (1 << value);
    }
    return 1;
}

答案 3 :(得分:1)

for each character in the string
  if any subsequent character matches it
    fail
succeed

答案 4 :(得分:0)

一种可能的解决方案 - 您可以将字符串提取为字符数组,对数组进行排序,然后循环遍历它,检查下一个字符是否等于当前字符。

答案 5 :(得分:0)

import java.io.*;

public class uniqueChar
{
    boolean checkUniqueChar(String strin)
    {
        int m;
        char []str=strin.toCharArray();
        java.util.Arrays.sort(str);
        for(int i=0;i<str.length-1;i++)
        {
            if(str[i]==str[i+1])
                 return false;
        }
        return true;
    }

    public static void  main(String argv[]) throws IOException 
    {
        String str;
        System.out.println("enter the string\n");
        InputStreamReader in=new InputStreamReader(System.in);
        BufferedReader bin=new BufferedReader(in);
        str=bin.readLine();
        System.out.println(new uniqueChar().checkUniqueChar(str));
    }
}

答案 6 :(得分:0)

partik描述的素数方法(基于此theorem)。这是O(N)。

# one prime per letter
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]

starting_byte = ?a.ord
primes_product = 1

ARGV[0].each_byte do |byte|
    current_prime = primes[byte - starting_byte]
    if primes_product % current_prime == 0
        puts "Not unique"
        exit 
    else
        primes_product = primes_product * current_prime
    end
end

puts "Unique"

答案 7 :(得分:0)

我在这个帖子中遇到了类似的问题,最后在C#中使用了以下解决方案:

        var data = "ABCDEFGADFGHETFASAJUTE";

        var hash = new Dictionary<char, int>();

        foreach (char c in data)
        {
            if (hash.ContainsKey(c))
            {
                hash[c] += 1;
            }
            else
            {
                hash.Add(c, 1);
            }
        }

        var Characters = hash.Keys.ToArray();
        var Frequencies = hash.Values.ToArray();

答案 8 :(得分:-1)

public static boolean isUniqueChars(String str) {
    int checker = 0;
    for (int i = 0; i < str.length(); ++i) {
        int val = str.charAt(i) - 'a';
        if ((checker & (1 << val)) > 0)
            return false;
        checker |= (1 << val);
    }
    return true;
}