`

查找字符串中第一个非重复字符

阅读更多

题目描述:编写一个高效函数,找到字符串中首个非重复字符。如"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;
            } 
        } 
	} 
}

 

第一种方法不通用,或者说有问题:对于大写字母就会出错了,另外对于其他字符比如#$%等也会出错。

分享到:
评论

相关推荐

    JavaScript实现查找字符串中第一个不重复的字符

    主要介绍了JavaScript实现查找字符串中第一个不重复的字符,需要的朋友可以参考下

    判断2个字符串是否含有相同的字符

    还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]数组记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找数组中最大值,此时目标子字符串的起点下标(i)和 i ...

    JS查找字符串中出现最多的字符及个数统计

    例如:求字符串’nininihaoa’中出现次数最多字符  var str = "nininihaoa"; var o = {}; for (var i = 0, length = str.length; i &lt; length; i++) { var char = str.charAt(i); if (o[char]) { o[char]+...

    c语言字符串分割,截取,子串查找,插入,删除

    int strarray_cat(char (*arr)[str_max_len],int i,char *str) //把二维arr字符串数组拼接成一个串,i是第一维的长度,存入str int replacate(char *res,int n,char const *str) //产生n个重复的str(串或者字符)存入...

    Python实现针对给定字符串寻找最长非重复子串的方法

    (1)从头开始遍历字符串,设置标志位,在往后走的过程中当发现和之前标志位重合的时候就回头检查一下这个新出现的子串是否跟前面字符串或者前面字符串的子串相同,相同则记录该子串并计数加1,直至处理完毕 ...

    C#从字符串中指定位置移除子字符串的方法

    本文实例讲述了C#从字符串中指定位置移除子字符串的方法。分享给大家供大家参考。具体如下: 字符串自带remove方法可以用于删除子... 您可能感兴趣的文章:C#查找字符串所有排列组合的方法C#遍历删除字符串中重复字符C#

    VBA常用技巧

    第1章Range(单元格)对象8 技巧1单元格的引用方法8 1-1使用Range属性8 1-2使用Cells属性9 1-3使用快捷记号9 1-4使用Offset属性10 1-5使用Resize属性11 1-6使用Union方法12 1-7使用UsedRange属性12 1-8使用...

    霍夫曼编码2个伪代码,对输入的字符集和各个字符对应的权值求出每个字符的霍夫曼编码。

    【样例输入】 4 a b c d 1 3 7 22 【样例输出】 a:000 b:001 c:01 d:1 【样例说明】 提示: 1、将最小两个子树合并过程中一定要从前向后去查找两个最小子树,最小子树作为新结点的左子树,次小子树作为新结点的右子...

    霍夫曼编码,对输入的字符集和各个字符对应的权值求出每个字符的霍夫曼编码。

    1、将最小两个子树合并过程中一定要从前向后去查找两个最小子树,最小子树作为新结点的左子树,次小子树作为新结点的右子树,编码过程中左子树定义为0,右子树定义为1 2、另外:一般原则要求:  若有重复权值结点...

    Visual C++ 2005入门经典--源代码及课后练习答案

    6.7.2 从字符串中删除空格 268 6.7.3 计算表达式的值 268 6.7.4 获得项值 271 6.7.5 分析数 272 6.7.6 整合程序 274 6.7.7 扩展程序 276 6.7.8 提取子字符串 277 6.7.9 运行修改过的程序 280 6.8 ...

    最大公共字符串leetcode-python-gibberish:技术面试数据结构与算法练习题

    如何找到给定字符串的第一个非重复字符? 如何计算字符串中给定字符的出现次数? 如何检查两个字符串是否为 Anagram? 在一个数组中存储了 1-100 个数字,缺少一个数字如何找到? 在一个数组中 1-100 多个数字是重复...

    javascript文档

    index 属性 返回在字符串中找到的第一个成功匹配的字符位置。 indexOf 方法 返回在 String 对象中第一次出现子字符串的字符位置。 不相等运算符 (!=) 比较两个表达式,看是否不相等。 Infinity 属性 返回 ...

    AlgorithmicTasks

    算法任务 编写一个对一组数字进行排序的函数,其中几率最先出现。 编写一个函数,以反转字符串中的每个单词,例如输入:“ My name is Max”输出:“ Max is name ...查找字符串中的第一个非重复字符(仅出现一次)。

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    微软JavaScript手册

    index 属性 返回在字符串中找到的第一个成功匹配的字符位置。 indexOf 方法 返回在 String 对象中第一次出现子字符串的字符位置。 不相等运算符 (!=) 比较两个表达式,看是否不相等。 Infinity 属性 返回 ...

    leetcode有效期-interactive-coding-challenges:我对Python编码面试挑战的解决方案(算法和数据结构)

    查找字符串中的第一个非重复字符 │ 删除字符串中的指定字符 │ (x) 反转字符串中的单词 │ 将字符串转换为整数 │ 将整数转换为字符串 │ 添加挑战 │ 链表 挑战 静态笔记本 (x) 从链表中删除重复项 │ 查找链表的...

    VBSCRIPT中文手册

    InStr 函数 返回一个字符串在另一个字符串中第一次出现的位置。 InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,...

    JScript 语言参考

    index 属性 返回在字符串中找到的第一个成功匹配的字符位置。 indexOf 方法 返回在 String 对象中第一次出现子字符串的字符位置。 不相等运算符 (!=) 比较两个表达式,看是否不相等。 Infinity 属性 返回 ...

    数据结构-文章编辑.doc

    【完成题目4】文章编辑 【问题描述】 输入一页文字,程序可以统计出文字、数字、空格的个数; 静态存储一页文章,每行最多不超过80个字符,共N行。 【基本要求】 1.分别统计出其中英文...从字符串s中寻找str第一次出

Global site tag (gtag.js) - Google Analytics