我的算法中第一个非重复字符的缺陷在哪里?

时间:2015-11-25 05:24:26

标签: c# algorithm optimization

作为求职面试的一部分,我将这些问题作为在线编码测试,我在下周被拒绝了。我试图弄清楚我是否做错了或者我是否做得对,但C#有更好的方法来完成相同的任务。

  

Q2)编写一种方法来查找字符串中的第一个非重复字符。

     

a)要写下你的答案,你可以使用你喜欢的任何语言。但是,如果您的语言已有库,则可能无法使用这些库。

     

b)字符串是字母字符和小写字母。   (例如,“aaaabbbcccdde” - >'e',“abcdefgh” - >'a',“aaabbbcccddd” - > null,“aabccdeef” - >'b')

我的回答:

public char? FirstNonrepeatingChar ( String s ) 
{
    // returns the first non-repeated character in s
    // returns null if no such character exists
 for ( int j = 0, n = s.Length;  j < n ; )
   {
         int i = j;
         while ( j < n && s[j] == s[i] ) ++j;    
         if ( (j - i) == 1 ) return s[i]; // found lone character
    }
    return null; // if made it here, no such character exists
}

1 个答案:

答案 0 :(得分:1)

找到第一个不重复的字符只是找到string[x-1] != string[x] && string[x] != string[x+1]的情况。您的解决方案有效,但可以在逻辑上简化:

if( String.IsNullOrEmpty(s) ) return null;
if( s.Length == 1 ) return s[0]; // Case 1: single-character string

if( s[0] != s[1] ) return s[0]; // Case 2: first character is different

for(int i = 1; i < s.Length - 1; i++) {

    // Main case 3: a sequence "aba" somewhere in the middle of the string
    if( s[i-1] != s[i] && s[i] != s[i+1] ) return s[i];
}

// Case 4: last character is different
if( s[ s.Length - 2 ] != s[ s.Length - 1 ] ) return s[ s.Length - 1 ];

// Case 5: Not found
return null;