找出字符串中第一个只出现一次的字符

find the first unique character in  a string and you can just traverse this string only one time. if there is no such character, just return ‘#‘ and ‘#‘ will not appear in the string, else return the character you find.

for example: "aAbBABac", return ‘b‘, and to "aBBa" return ‘#‘ as the final result.

方法一:

大家熟知的,以往我们找一个字符串中第一个只出现一次的字符的时候都允许重新遍历字符串,解决的思路是建立一个hash表,hash[256],遍历一遍字符串,记录每个字符出现的次数,然后在重新遍历字符串,查看每个字符出现的次数,如果出现的次数为1,则打印出此字符,遍历停止。 然而,当只要求遍历一遍字符串的时候,只能得到每个字符出现的次数,不能得到字符原来在字符串中的排列顺序。只要能想到这一点,就能够解决问题了。再重新设定一个order数组来记录字符出现的次序,然后遍历次序数组,取出第几次出现的是哪个字符,然后在到hash表中找它出现的次数,如果次数为1,那么就找到符合要求的字符串了。代码如下:

char first_unique_word(char *s)
{
	if (strlen(s)==0)  exit(0);
	if (strlen(s)==1)  return s[0];
	const unsigned int length=strlen(s);
	vector<int> num(256,0);
	vector<int>order(256,0);
	char res='#';
	for (int i=0;i<length;i++)
	{
		if (s[i]!='/0')
		{
			num[s[i]]++;
			order[i]=s[i];//i顺序记录出现的元素
		}
	}
	for (int j=0;j<length;j++)
	{
		if (num[order[j]]==1)
		{
			res=order[j];
			break;
		}
	}
	return res;
}

方法二

方法一利用一个order数组记录顺序出现的元素,在遍历完原字符串后,还需便利一次order数组,时间复杂度为O(2n),其实在字符串中就已经记录了字符出现的先后顺序,我们可以找一种方法,不用遍历order数组,直接读取其中字符即可。因为要求的是字符串中第一次出现的唯一字符,此字符是唯一的。所以我们从后往前遍历这个字符串,最后一个新加入order的元素就是从来没有出现的且是第一次出现的。代码如下:

char first_unique_word1(char *s)
{
	if (strlen(s)==0)  exit(0);
	if (strlen(s)==1)  return s[0];
	const unsigned int length=strlen(s);
	vector<int> num(256,0);
	vector<int>order(256,0);
	char res='#';
	int j=0;
	for (int i=length-1;i>=0;i--)
	{
		if (s[i]!='/0')
		{
			num[s[i]]++;
			if (num[s[i]]==1)
			{
				order[j]=s[i];
				j++;
			}
		}
	}
	if (num[order[j-1]]==1)
	{
		res=order[j-1];
	}
	return res;

}

完整代码如下:

#include<iostream>
#include <vector>
using namespace std;
char first_unique_word(char *s);
char first_unique_word1(char *s);
void main()
{
	char s[]="abbfabbcde";
	cout<<first_unique_word(s)<<endl;
	cout<<first_unique_word1(s)<<endl;

}
char first_unique_word(char *s)
{
	if (strlen(s)==0)  exit(0);
	if (strlen(s)==1)  return s[0];
	const unsigned int length=strlen(s);
	vector<int> num(256,0);
	vector<int>order(256,0);
	char res='#';
	for (int i=0;i<length;i++)
	{
		if (s[i]!='/0')
		{
			num[s[i]]++;
			order[i]=s[i];
		}
	}
	for (int j=0;j<length;j++)
	{
		if (num[order[j]]==1)
		{
			res=order[j];
			break;
		}
	}
	return res;
}
char first_unique_word1(char *s)
{
	if (strlen(s)==0)  exit(0);
	if (strlen(s)==1)  return s[0];
	const unsigned int length=strlen(s);
	vector<int> num(256,0);
	vector<int>order(256,0);
	char res='#';
	int j=0;
	for (int i=length-1;i>=0;i--)
	{
		if (s[i]!='/0')
		{
			num[s[i]]++;
			if (num[s[i]]==1)
			{
				order[j]=s[i];
				j++;
			}
		}
	}
	if (num[order[j-1]]==1)
	{
		res=order[j-1];
	}
	return res;

}

以上代码输出为

f

f

时间: 2024-12-19 17:18:38

找出字符串中第一个只出现一次的字符的相关文章

华为OJ:找出字符串中第一个只出现一次的字符

可以稍微让代码写的好看,不用直接写双循环的话,就可以写成函数的调用,重用性也很高. import java.util.Scanner; public class findOnlyOnceChar { public static boolean FindChar(String pInputString, char pChar){ int count=0; for(int i=0;i<pInputString.length();i++){ if(pInputString.charAt(i)==pCh

35 - 找出字符串中第一个只出现一次的字符

在一个字符串中找到第一个只出现一次的字符. 如输入"abaccdeff",输出'b' 解析: 使用一个数组,记录每个字符出现的次数,最后遍历计数数组,第一个个数为 1 的即为结果. 由于字符char,只有8 bit, 只有255种可能,因此只需声明一个255大小的数组. 遍历一次字符串,遍历2次计数数组:时间复杂度O(n) 空间占用255*int = 512 Byte,是一个固定大小:空间复杂度O(1) 当需要统计某个或某些字符是否出现或出现在字符串中的次数时,可以通过数组实现一个简易

[华为]找出字符串中第一个只出现一次的字符

输入描述: 输入一个非空字符串 输出描述: 输出第一个只出现一次的字符,如果不存在输出-1 输入例子: asdfasdfo 输出例子: o 1 //用哈希统计词频 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 int hasTable[256]; 6 7 int main() 8 {     9 string s;     10 while(cin>>s) 11 {         12

找出字符串中第一个只出现一次的字母

// 一个字符串由[a-z]组成,请找出该字符串第一个只出现一次的字母: var str = "354691236549870213654789501287i45465444" var obj = {};//去重 for(var i = 0; i < str.length;i++){ var count = 1: obj[str[i]] = count: } arr = Object.keys(obj): var arr_ = []: for(i in arr){ var num

字符串中第一个只出现一次的字符,如何优化算法使得遍历次数更少?

/** * 只允许遍历一遍字符串 */ public class 找出字符串中第一个只出现一次的字符 { public static void main(String[] args) { // 测试字符串 String str = "asdsacjj"; // 字符串转化成字符 char[] strToChar = str.toCharArray(); int len = strToChar.length;//字符串长度 //hashset用于判断是否出现过 HashSet<Ch

找出字符串中第一个不重复的字符(JavaScript实现)

如题~ 此算法仅供参考,小菜基本不懂高深的算法,只能用最朴实的思想去表达. 1 //找出字符串中第一个不重复的字符 2 // firstUniqueChar("vdctdvc"); --> t 3 function firstUniqueChar(str){ 4 var str = str || "", 5 i = 0, 6 k = "", 7 _char = "", 8 charMap = {}, 9 result =

找出字符串中第一个出现次数最多的字符

找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true  输出成功 #include <iostream> #include <string.h> using namespace std; b

《剑指offer》第五十题I:字符串中第一个只出现一次的字符

// 面试题50(一):字符串中第一个只出现一次的字符 // 题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出 // 'b'. #include <cstdio> #include <string> char FirstNotRepeatingChar(const char* pString) { if (pString == nullptr) return '\0'; const int tableSize = 256; //c

求字符串中第一个只出现一次的字符

问题描述:给定一个字符串,假设字符串中只包含字母和数字,求出这个字符串中第一个只出现一次的字符. 分析:这个题目想要做出来还是比较简单的,关键是如何用高效的方法求解.这里我提供两种方法: 解法一:蛮力法.具体思想为,从第一位开始,拿每一位和后面的每一位进行比较,如果没有出现,则直接输出这个字符. 如果出现,则从第二位开始,再和后面的每一位进行比较,依次类推. 算法的时间复杂度为O(n^2). 解法二:哈希法.采用两次扫描即可实现.需要提前构建一个哈希表,把字符当成key值,把出现的次数当成val