매일 알고리즘 시리즈 배우 기 (17) (한 문자열 에서 첫 번 째 로 한 번 만 나타 나 는 문 자 를 찾 습 니 다)

제목:
한 문자열 에서 첫 번 째 로 한 번 만 나타 나 는 문 자 를 찾 습 니 다. 예 를 들 어 abaccdeff 를 입력 하면 b 를 출력 합 니 다. (이 문 제 는 2006 년 구 글 의 필기시험 문제 입 니 다)
 
사고방식 1:
제목 은 문자 가 나타 나 는 횟수 와 관련 되 기 때문에 모든 문자 가 이 문자열 에 나타 나 는 횟수 를 통계 할 수 있 습 니 다. 이러한 목적 을 달성 하려 면 Hash 표를 이용 하여 이러한 문 제 를 풀 수 있 습 니 다. 모든 char 를 수용 할 수 있 는 배열 을 용기 로 하고 해당 하 는 문자 에 대응 하 는 ASCLL 코드 값 을 다음 표 로 매 핑 할 수 있 습 니 다.이렇게 하면 우 리 는 두 번 을 옮 겨 다 니 면 첫 번 째 로 한 번 만 나타 난 문 자 를 찾 을 수 있다.현재 의 문 제 는 배열 이 얼마나 정의 해 야 하 느 냐 하 는 것 이다.문자 (char) 는 길이 가 8 인 데이터 형식 이기 때문에 모두 256 가지 가능성 이 있 습 니 다. 그래서 우 리 는 길이 가 256 인 배열 을 만 들 었 습 니 다. 모든 자 모 는 ASCII 코드 값 에 따라 배열 의 아래 표 시 된 배열 의 대응 항목 으로 하고 배열 에 저 장 된 것 은 모든 문자 가 대응 하 는 횟수 입 니 다.
 
코드 는 다음 과 같 습 니 다:
#include "stdafx.h"
#include <assert.h>
#define	 ALL_CHAR_COUNT		256


/*----------------------------
             .
Copyright by yuucyf 2011.07.21
-----------------------------*/
TCHAR FindFristAppearChar(TCHAR* lptszStr)
{
	assert(NULL != lptszStr);

	TCHAR atszHashMap[ALL_CHAR_COUNT + 1] = {0};
	int i32Len = _tcslen(lptszStr);
	for (int i32I = 0; i32I < i32Len; i32I++)
		atszHashMap[*(lptszStr+i32I)]++;

	for (int i32J = 0; i32J < i32Len; i32J++)
	{
		if (atszHashMap[*(lptszStr + i32J)] == 1)
			return *(lptszStr+i32J);
	}

	return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
	TCHAR* lptszStr = _T("abaccdeff");
	
	_tprintf(_T("First appear char is %c.
"), FindFristAppearChar(lptszStr)); return 0; }

좋은 웹페이지 즐겨찾기