题目描述:编写一个高效函数,找到字符串中首个非重复字符。如"total"首个非重复字符为'o',"teeter"为'r'。(时间复杂度最好为o(n))。代码如下:
package cn.lifx.test;
import java.util.Hashtable;
public class FindFirstUnique
{
private static final int N = 26;
private static final String letters = "abcdefghigklmnopqrstuvwxyz";
public static void main(String[] args)
{
String str = "totalo";
findFirstUnique(str);
findFirstUnique2(str);
findFirstUnique3(str);
}
public static void findFirstUnique(String str)
{
char ch = 'a';
int index = 0;
int[] a = new int[N];
for(int i=0; i<a.length; i++)
a[i] = 0;
for(int i=0; i<str.length(); i++)
{
ch = str.charAt(i);
index = 25 - 'z' + ch;
a[index]++;
}
int min = Integer.MAX_VALUE;
for(int i=0; i<a.length; i++)
{
if(a[i] == 1)
{
ch = letters.charAt(i);
index = str.indexOf(ch);
if(index < min)
min = index;
}
}
if(min < Integer.MAX_VALUE)
{
System.out.println(str.charAt(min));
}
else
{
System.out.println("字符串中没有唯一不同的字符!");
}
}
public static void findFirstUnique2(String str)
{
char ch;
int index;
int lastindex;
for(int i=0; i<str.length(); i++)
{
ch = str.charAt(i);
index = str.indexOf(ch);
lastindex = str.lastIndexOf(ch);
if(index == lastindex)
{
System.out.println(ch);
break;
}
}
}
public static void findFirstUnique3(String str)
{
Character c;
Object seenOnce = new Object();
Object seenTwice = new Object();
Hashtable<Character, Object> charHash = new Hashtable<Character, Object>();
for(int i=0; i<str.length(); i++)
{
c = new Character(str.charAt(i));
Object object = charHash.get(c);
if(object == null)
{
charHash.put(c, seenOnce);
}
else if(object.equals(seenOnce))
{
charHash.put(c, seenTwice);
}
}
for(int i=0; i<str.length(); i++)
{
c = new Character(str.charAt(i));
if(charHash.get(c)==seenOnce)
{
System.out.println(c);
break;
}
}
}
}
第一种方法不通用,或者说有问题:对于大写字母就会出错了,另外对于其他字符比如#$%等也会出错。