浏览 2360 次
锁定老帖子 主题:查找字符串中第一个非重复字符
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-08
最后修改:2009-09-09
题目描述:编写一个高效函数,找到字符串中首个非重复字符。如"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; } } } }
第一种方法不通用,或者说有问题:对于大写字母就会出错了,另外对于其他字符比如#$%等也会出错。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |