首页 > 代码库 > 查找兄弟单词

查找兄弟单词

/******************************************************************************

  Copyright (C), 2001-2012, Huawei Tech. Co., Ltd.

 ******************************************************************************
  File Name     : FindSimilarWord.cpp
  Version       :
  Author        :
  Created       : 2012/09
  Last Modified :
  Description   :
  Function List :

  History       :
  1.Date        : 2012/09
    Author      :
    Modification: Created file

******************************************************************************/


#include<iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

map<string, string> g_SubMap;
/******************************************************************************
原    型:int AddOneWord (char* Word);
功    能:在字典中增加一个单词
输入参数: 
          Word 单词字符串,调用者保证Word指针不为空,指向的是合法单词
输出参数:
          无
返回值:
        -1 失败(单词在字典中已存在等情况)
        0  成功
********************************************************************************/
int AddOneWord (char* Word)
{
    /* 在这里实现功能 */
	if (NULL == Word)
	{
		return -1;
	}
	string sAddWord =Word;
	map<string, string>::iterator itr = g_SubMap.find(sAddWord);
	if (g_SubMap.end() != itr)
	{
		return -1;
	}
	string sAddWordSub = Word;
	sort(sAddWordSub.begin(), sAddWordSub.end());
	g_SubMap.insert(make_pair(sAddWord, sAddWordSub));

    return 0;
}

/******************************************************************************
原    型:int FindSimilarWordNum (char* Word);
功    能:查找指定单词在字典中的兄弟单词个数
输入参数:
          Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
输出参数:
          无
返回值:
          返回指定单词在字典中的兄弟单词总个数。如果不存在兄弟单词,返回0
*******************************************************************************/
int FindSimilarWordNum (char* Word)
{

    /* 在这里实现功能 */
	if (NULL == Word)
	{
		return 0;
	}
	string sTemp = Word;
	string sSub = Word;
	sort(sSub.begin(), sSub.end());
	int count = 0;
	for (map<string, string>::iterator itr = g_SubMap.begin(); itr != g_SubMap.end(); ++itr)
	{
		if (itr->second == sSub && itr->first != sTemp)
		{
			count++;
		}
	}

    return count;
}

/******************************************************************************
原    型:int FindOneSimilarWord (char* Word, int Seq, char* SimilarWord);
功    能:查找指定单词的指定序号的兄弟单词,指定序号指字典中兄弟单词按字典顺序
          排序后的序号(从1开始)
输入参数:
          Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
          Seq 指定序号(大于等于1)
输出参数:
          SimilarWord 返回兄弟单词字符串,指针不为空,指向的内存由调用者预先分配,
          占51个字节长度,输出的兄弟单词必须紧跟’\0’结束。如果不存在指定序号的
          兄弟单词,输出空串。
返回值:
          -1 失败(如果不存在指定序号的兄弟单词,返回失败)
          0  成功
*******************************************************************************/
int FindOneSimilarWord (char* Word, int Seq, char* SimilarWord)
{
    /* 在这里实现功能 */
	if (NULL == Word || NULL == SimilarWord || 0 >= Seq)
	{
		return -1;
	}
	int count =0;
	string sTemp = Word;
	string sSub = Word;
	sort(sSub.begin(), sSub.end());

	for (map<string, string>::iterator itr = g_SubMap.begin(); itr != g_SubMap.end(); ++itr)
	{
		if (itr->second == sSub && itr->first != sTemp)
		{
			count++;
			if (Seq == count)
			{
				strncpy(SimilarWord, (itr->first).c_str(), (itr->first).length());
				return 0;
			}
		}
	}
	SimilarWord[0] = '\0';
    return -1;
}

/******************************************************************************
原    型:void ClearAllWords(void);
功    能:清空字典中所有单词
输入参数: 
          无
输出参数:
          无
返回值:
          无

*******************************************************************************/
void ClearAllWords(void)
{
    /* 在这里实现功能 */
	g_SubMap.clear();
}


int main()
{
	char *Test_Word[7] = {
		"mock",
		"aabc",
		"abc",
		"ckom",
		"bcaa",
		"abca",};

	AddOneWord(Test_Word[0]);
	AddOneWord(Test_Word[1]);
	AddOneWord(Test_Word[2]);
	AddOneWord(Test_Word[3]);
	AddOneWord(Test_Word[4]);
	AddOneWord(Test_Word[5]);

	int Expectnumber = 1;
	int ActualNumber;
	int Ret;

	ActualNumber = FindSimilarWordNum (Test_Word[0]);
	

	char *ExpectWord = {"bcaa"};
	char SimilarWord[51] = {'\0'};
	int Seq = 2;
	Ret = FindOneSimilarWord (Test_Word[1], Seq, SimilarWord);
	return 0;
}

查找兄弟单词