给定一个单词,从字典查找该单词的所有兄弟单词。

     最近在网上看到百度的一个面试题:一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。

     我的思路是这样的,所谓A单词是B单词的兄弟单词,无非就是组成A和B两个单词的所有字母都是一样,无非就是顺序不一样罢了。因此只要把单词按照AscII值来进行排序,然后判断下两个拍好序的单词是否完全一样,如果完全一样就是兄弟单词,否则就不是。下面是我用C#实现的代码。供参考,欢迎大家提供更好的思路。

      

       static void Main(string[] args)

        { 

            string[] Vocabularys = { "abcd", "ab", "army", "mary", "mnay", "mray", "myar", "rmay", "abcd" };

            Vocabularys = GetBrotherVocabularys(Vocabularys, "army");

            Console.WriteLine("the vocabularies of army's brother vocabulary are :");

            foreach (string vocabulary in Vocabularys)

            {

                Console.Write("{0} ", vocabulary);

            }

            Console.Read();

        }

        /// <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();

        }

 

        /// <summary>

        /// 给定一个字符串数组,返回该数组中的是给定字符串的兄弟字符串的那些字符串

        /// </summary>

        /// <param name="vocabularys">字符串数组</param>

        /// <param name="keyVocabulary">给定字符串</param>

        /// <returns></returns>

        private static string[] GetBrotherVocabularys(string[] vocabularys, string keyVocabulary)

        {

            List<string> lst = new List<string>();

            IList<char> keyList = GetCharListByVoca(keyVocabulary);

            int len = keyVocabulary.Length;

            foreach (string item in vocabularys)

            {

                if (item.Length == len)

                {

                    if (IsBrotherVoca(item, keyList))

                    {

                        lst.Add(item);

                    }

                }

            }

            return lst.ToArray();

        }

 

        private static bool IsBrotherVoca(string vocabulary, IList<char> keyVocaCharList)

        {

            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;

        }

 

 

  运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从标准输入读入一个英文单词查找方式,在一个给定的英文常用单词字典文件dictionary3000.txt查找单词,返回查找结果(查找到返回1,否则返回0)和查找过程单词的比较次数。查找前,先将所有字典单词读入至一个单词表(数组),然后按要求进行查找字典单词总数不超过3500,单词的字符都是英文小写字母,并已按字典序排好序(可从课件下载区下载该字典文件)。字典单词和待查找单词的字符个数不超过20。 查找方式说明:查找方式以1~4数字表示,每个数字含义如下: 1:在单词以顺序查找方式查找,因为单词表已排好序,遇到相同的或第一个比待查找单词大的单词,就要终止查找; 2:在单词以折半查找方式查找; 3:在单词通过索引表来获取单词查找范围,并在该查找范围以折半方式查找。索引表构建方式为:以26个英文字母为头字母的单词字典的起始位置和单词个数来构建索引表,如: 字母 起始位置 单词个数 a 0 248 b 248 167 … … … 该索引表表明以字母a开头的单词单词的开始下标位置为0,单词个数为248。 4:按下面给定的hash函数为字典单词构造一个hash表,hash冲突时按字典序依次存放单词。hash查找遇到冲突时,采用链地址法处理,在冲突链表找到或未找到(遇到第一个比待查找单词大的单词或链表结束)便结束查找。用c语言写出方法四的代码
最新发布
05-19

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值