题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 分析:这道题是2006年google的一道笔试题。
看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂度是O(n2)。我们试着去找一个更快的方法。
由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用是把一个字符映射成一个数字。在常用的数据容器中,哈希表正是这个用途。
哈希表是一种比较复杂的数据结构。由于比较复杂,STL中没有实现哈希表,因此需要我们自己实现一个。但由于本题的特殊性,我们只需要一个非常简单的哈希表就能满足要求。由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项,而数组中存储的是每个字符对应的次数。这样我们就创建了一个大小为256,以字符ASCII码为键值的哈希表。
我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。
java代码参考:
public static char FirstNotRepeatingChar(String str)
{
if(str == null || str.equals(""))
return 0;
int []counts = new int[256];
char ch;
int index;
for(int i=0; i < str.length();i++)
{
ch = str.charAt(i);
index = (int)ch;
counts[index]++;
}
for(int i =0; i< str.length(); i++)
{
ch = str.charAt(i);
index = (int)ch;
if(counts[index] == 1)
return ch;
}
return 0;
}
分享到:
相关推荐
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。 【输入】 一个字符串,长度小于100000。 【输出】 输出第一个仅出现一次的字符,若没有则输出no。 【输入样例】 abcabd ...
给定一个字符串列表’strlist’和整数‘k’ 请编写函数‘func’, 它返回字符串列表中‘k’个相邻字符串中最长的第一个
给定一个字符串,在字符串中找到第一个连续出现至少k次的字符。 【输入】 第一行包含一个正整数k,表示至少需要连续出现的次数。1 ≤ k ≤ 1000。 第二行包含需要查找的字符串。字符串长度在1到2500之间,且不包含...
(5)输出字符“o”在字符串中第一个位置的索引值。(如没有该字符则返回-1)(6)输出字符“o”出现的总次数。(7)将字符串中所有的“.”替换为“-”并输出。(8)将字符串中所有的字母转换为大写字母并输出。(9)...
在一个字符串中查找第一个子串,并输出第一个子串的下标 如:This is a test message!为字符串 ,子串为 is 则输出为2
1. **删除一个字符**:从字符串中移除一个字符。 2. **插入一个字符**:向字符串中添加一个字符。 3. **替换一个字符**:将字符串中的一个字符替换成另一个不同的字符。 #### 三、编辑距离的计算方法 为了计算两个...
给定字符串A和两个索引n和m,我们从A的第n个字符开始到第m个字符(不包括m)截取子串。这可以通过创建一个新的字符串,然后遍历原字符串的指定区间并将字符复制到新字符串中来完成。 4. **字符串的比较**: 判断...
这个名为"找到字符串S第一个不在T中出现的字符"的程序,旨在解决一个特定的字符串问题:从两个单链表存储的字符串S和T中,找出字符串S中第一个不在字符串T中出现的字符。 首先,我们要理解链表和字符串的基本概念。...
去掉重复的字符串及在第一个字符串中删除在第二个字符串中出现的字符两个程序,vs2013已经验证
该字母表产生的升序字符串是指字符串中字母按照从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1 次。例如,a,b,ab,bc,xyz 等字符串都是升序字符串。现在对字母表A 产生的所有长度不超过6 的...
根据给定的文件信息,我们可以总结出以下关于“求一个字符串中的连续出现次数最多的字串”的相关知识点: ### 一、问题定义与分析 #### 1.1 问题背景 在计算机科学中,字符串处理是常见且重要的任务之一。本问题是...
标题 "比较字符串1" 描述的是一个算法训练问题,旨在比较两个字符串的字典序,并在它们不相等时找出第一个不同的字符。这个问题涉及到的主要知识点包括字符串操作、字典序比较以及基本的ASCII码理解。 首先,我们...
根据给定的信息,我们可以分析并总结出以下与“求字符串中的第一个数字”相关的知识点: ### 1. 字符串操作基础 #### 1.1 字符串简介 在 Java 中,`String` 类用于表示不可变的字符序列,即字符串。字符串在 Java ...
第一行为统计出来的字符出现频率(只输出存在的字符,格式为:字符:频度),每两组字符之间用一个空格分隔,字符按照ASCII码从小到大的顺序排列。第二行至第2n行为哈夫曼树的存储结构的终态(形如教材139页表5.2(b...
根据给定的信息,我们需要实现一个C语言函数`void fun(char *s,char *t,char *p)`,该函数的功能是:将未在字符串`s`中出现、而在字符串`t`中出现的字符形成一个新的字符串并存储在指针`p`指向的空间内。新字符串中...
题目中给出的标签“判断子串”提示我们,我们需要编写一个程序或函数,接受两个字符串作为输入,并返回一个布尔值,表示第二个字符串是否为第一个字符串的子串。 在编程中,有多种方法可以实现这个功能。以下是一些...
在Java编程中,统计字符串中每个...这个程序可以方便地统计任何给定字符串中每个字符的出现次数,包括大小写字母。在实际应用中,可以修改或扩展这个程序以适应其他需求,例如忽略大小写、只统计特定字符集内的字符等。
根据给定的信息,本文将详细解释如何在一个字符串中查找特定子串出现的次数,并通过提供的代码示例来进一步阐述这一过程。我们将从以下几个方面进行深入探讨: ### 1. 字符串与子串的基本概念 #### 1.1 字符串 在...
对于给定的字符串A和B,试设计一个算法,计算其扩展距离。 ?编程任务: 对于给定的字符串A和B,编程计算其扩展距离。 Input 由文件input.txt给出输入数据。第1 行是字符串A;第2 行是字符串B。第3行是空格 与...