这个应该算是百度笔试的经典题了,我记得去年打酱油笔试百度实习生的时候就考了这个题,现在再来看看!
关于这个题,我觉得应该有几个思考的方法,大家看看觉得哪种好啦!或者有更好的记得分享啦!
方法一:【转自】http://www.cnblogs.com/shaosks/archive/2012/05/07/2487602.html
该作者认为判断词A和词B是否是兄弟单词就是看组成A和B两个单词的所有字母是不是都一样,只是顺序不同。
所以,思路大概是,将单词A与单词B按照AscII值来进行排序,如果一样则为兄弟单词。
首先是计算词A的AscII值,然后遍历给定的词典,对于词典中的每一个值计算其AscII值,与上一步求出的AscII值进行比较,如果相等,这个单词就是单词A的兄弟词典。
【感觉可以改进的地方是先判断词典中词的长度是否等于词A的长度,如果相等再进行上面的比较,如果不相等则直接跳过,这样能减小复杂度】
具体实现如下:
/// <summary>
/// 把一个字符串单词转化为一个字符列表
/// </summary>
/// <param name="vocabulary"></param>
/// <returns></returns>
private static IList<char> GetCharListByVoca(string vocabulary)
{
return (from m in vocabulary.ToCharArray() orderby m ascending select m).ToList();
}
private static bool IsBrotherVoca(string vocabulary, IList<char> keyVocaCharList) //keyVocaCharList为输入词A的AscII值,vocabulary为词典中的词
{
IList<char> vocaCharList = GetCharListByVoca(vocabulary);
int i = 0;
bool flag = true;
foreach (char c in vocaCharList)
{
if (c != keyVocaCharList[i])
{
flag = false;
break;
}
i++;
}
return flag;
}
方法二:
找到词A的所有兄弟单词,然后将这个list里的单词逐个的在字典中搜索。
根据“兄弟单词”的定义,词A的兄弟单词是将词A的字母进行交换的结果【不止交换一次】
首先得到【交换一次的】A的兄弟单词,然后将这些兄弟单词分别进行递归,直到所有情况都出现为止,但是这种情况对于长度比较长的词A来说是很不可取的!