流中的第一个非重复字符

时间:2017-05-09 23:36:12

标签: java string algorithm data-structures

我对这个问题的回答如下,但我想知道我是否可以使用此代码以及复杂性是什么:

import java.util.LinkedHashMap;
import java.util.Map.Entry;

public class FirstNonRepeatingCharacterinAString {

    private char firstNonRepeatingCharacter(String str) {       
        LinkedHashMap<Character, Integer> hash =
                new LinkedHashMap<Character, Integer>();

        for(int i = 0 ; i< str.length() ; i++)
        {
            if(hash.get(str.charAt(i))==null)
                hash.put(str.charAt(i), 1);
            else
                hash.put(str.charAt(i), hash.get(str.charAt(i))+1);
        }

        System.out.println(hash.toString());

        for(Entry<Character, Integer> c : hash.entrySet())
        {
            if(c.getValue() == 1)
                return c.getKey();
        }

        return 0 ;
    }

    public static void main(String args[])
    {
        String str = "geeksforgeeks";
        FirstNonRepeatingCharacterinAString obj =
                new FirstNonRepeatingCharacterinAString();
        char c = obj.firstNonRepeatingCharacter(str);
        System.out.println(c);
    }
}

1 个答案:

答案 0 :(得分:2)

关于你是否“可以使用此代码”的问题有点含糊不清 - 如果你写了,我认为你可以使用它:)

至于复杂性,O(n)其中nString中的字符数。要计算出现次数,您必须遍历整个String,再次迭代它们以查找计数为1的第一个。在最坏的情况下,您没有非重复字符,或者唯一的非重复字符是最后一个字符。在任何一种情况下,您都必须再次迭代整个String。所以它是O(n+n) = O(n)

修改

顺便说一下,你的代码中有一个错误。由于您使用的是插入订单 LinkedHashMap,因此每次调用put(Character,Integer)都会导致对基础列表进行重新排序。您应该使用LinkedHashMap<Character,int[]>代替,并在放置之前检查是否存在密钥。如果它们存在,那么只需增加int[]中存储的值,以避免通过进行另一次put调用来重新定位地图。即便如此,结果列表将按照您迭代它的方式的顺序颠倒,因此第一个非重复字符将是您在迭代时找到的最后一个字符,其值为1。 ,你可以在第一个for循环中反向迭代,如果第一个非重复字符早于原始Entry中的最后一个字符,你就不必总是遍历整个String集合。 {1}}。