找出字符串中第一个不重复的字母

昨天看到一个面试题,说是要在一个字符串中找到第一个不重复的字符。

初始思路如下:

扫描一遍字符串,生成一个链表,越早出现的字符越靠近链表头,最后出现的在链表尾。每次从字符串中扫描到一个字符后,在链表中搜索,找到则其计数加一,否则加入到链表尾。最后遍历这个链表,第一个出现次数为1的就是第一个不重复的字符。

改进后方法:

考虑到如果字符串很长,每次需要去链表中查询是否有此字符,因此设计一个索引Index[26]对应26个英文字母,此索引元素是指向链表节点的指针。每次判断扫描的字符是否存在时,直接看Index[m]是否为NULL,是则将其加入到链表尾,同时位置赋值给此索引。反之,直接自加一。

编译平台:Redhat AS 5(kernel 2.6.18) gcc 4.1.1版本

程序不足之处:假设了字符串是26个英文小写字母组成。

/*
 * =====================================================================================
 *
 *       Filename:  findfirstUnrepeatChar.c
 *
 *    Description: find the first unrepeat character in a string. 
 *
 *        Version:  1.0
 *        Created:  03/30/2012 10:49:16 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Lujp (harry), ljp827@gmail.com
 *   Organization:  
 *
 * =====================================================================================
 */
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

#define	ENGLISH_CHAR_NUM 26	

typedef struct _ListNode{
	char ch_data;
	int showup_times;
	struct _ListNode *next;
}ListNode, *pListNode; 

int FindFirstUnrepeatChar(char *str, char *find)
{
	if (str == NULL || find == NULL)
	{
		printf("parameter wrong.\n");
		return -1;
	}

	pListNode Index[ENGLISH_CHAR_NUM] = {NULL};
	pListNode list_head, list_end;
	pListNode temp = NULL;
	list_head = NULL;
	list_end  = NULL;
	char *temp_str = str;
	int CharNum = 0;//字母在26个字母中的顺序数

	for(; *temp_str != '\0'; temp_str++)
	{
		CharNum = *temp_str - 'a';
		if (CharNum >= 26 || CharNum <0)
		{
			printf("invalid character in the string.\n");
			return -1;
		}

		if (Index[CharNum] == NULL)
		{
			temp = (pListNode)malloc(sizeof(ListNode));
			if (temp == NULL)
			{
				printf("malloc failed.\n");
				return -1;
			}
			temp->ch_data = *temp_str;
			temp->showup_times = 1;
			temp->next = NULL;
			Index[CharNum] = temp;

			if (list_head == NULL)
			{
				list_head = temp;
				list_end  = temp;
			}
			else
			{
				list_end->next = temp;
				list_end = temp;
			}
		}
		else
		{
			Index[CharNum]->showup_times += 1;
		}
	}
	
	temp = list_head;
	while(temp != NULL)
	{
		if (temp->showup_times == 1)
		{
			*find = temp->ch_data;
			break;
		}
		temp = temp->next;
	}

	if (temp == NULL)
	{
		printf("No Unrepeat Char\n");
	}

	for (CharNum = 0; CharNum < ENGLISH_CHAR_NUM; CharNum++)
	{
		if (Index[CharNum] != NULL)
		{
			free(Index[CharNum]);
			Index[CharNum] = NULL;
		}
	}
 
	return 0;
}

int main()
{
	char str[] = "abcdefghiabcefi";
	int rc = 0;
	char find;
	rc = FindFirstUnrepeatChar(str, &find);
	printf("return value: %d, find = %c\n", rc, find);
	return rc;
}


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页