返回字符串中的第一个非重复字符

时间:2011-06-28 05:46:28

标签: c++ algorithm

我必须解决这个问题,其中给定一个字符串,我必须返回字符串中存在的第一个非重复字符。

我使用hashtable解决了它并编写了一个方法,该方法对字符串进行常量引用并返回第一个非重复字符。但是,当字符串中没有非重复字符时,我返回-1并在主程序中检查如下

char c = firstNonRepeating( word );
if (static_cast<int> (c) == -1)
     cout<<"no non repeating character present\n";
else
     cout<<c<<endl;

是否存在所需字符时返回-1的正确方法?

4 个答案:

答案 0 :(得分:2)

return只需0即可。因为逻辑上,在任何情况下0都是任何以空字符结尾的字符串中的第一个非重复字符!

我认为返回-1容易出错,因为您对int进行投射,而且255也是有效字符。

答案 1 :(得分:1)

这可能是一种风格问题,但我宁愿选择以下内容:

char c;
bool result = getFirstNonRepeating(word, c);

if (result)
     cout << "no non repeating character present\n";
else
     cout << c << endl;

如果c返回getFirstNonRepeating,则未指定调用后false的值。

这样,返回值与操作的结果(或失败)之间不存在歧义,即使对于getFirstNonRepeating'\0'字符,0xFF函数也可以正常工作你需要改变逻辑。

答案 2 :(得分:0)

还有一个选项:为了更类似于STL算法,你可以将迭代器返回到第一个非重复字符,如果它不存在,只需返回string.end()。

答案 3 :(得分:0)

我已经使用HashMap来计数字符

FirstNonRepeating(String s){
HashMap<Character, Integer> count = new HashMap<Character, Integer>();
    int n = s.length();

    for (int i = 0; i < n; i++) {
        char c = s.charAt(i);
        count.put(c, count.getOrDefault(c, 0) + 1);
    }

    // find & print the index position 
    for (int i = 0; i < n; i++) {
        if (count.get(s.charAt(i)) == 1) 
            System.out.println(i); 
}