算法与数据结构面试分享(十九)判断两个字符串是否模式相似

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gaoming201314/article/details/79979392

这是今天下午同事出的一道面试题,在线面试的,不过小伙十几分钟里没有搞定,同事是个妹子,很想给提示的,可惜小伙没给机会呀。看题哈。

题目:首先给了一个定义,假设两个字符串的模式一样,我们就认为他们相似。举个例子,字符串1: “abb”,字符串2: “cee“。他们的模式是一样的,我们认为相似,能帮我实现一个算法,可以利用现有的库函数,语言不限,你有什么问题要和我确认的吗?

题目出去了,线上的小伙蒙了。估计没见过这道题,也没见过这样去定义相似。不和大家过多的讲他们具体聊的过程哈,我们还是先一起分析这道题。

1. 相似在这里理解为模式是类似的

2. 可以利用现有的数据结构,可是使用什么呢?我们得先确定问题才能选用恰当的数据结构呀

3. 举例子, “abb”与 “cee”相似很容易理解第一个字符a,c都只出现了一次,第二个字符bb,ee和之前的字符都不同,但都出现了两次。

4. 继续挖掘例子,让我们充分理解问题哈。我们需要确认, “abba”和“ceef”是否相似?这个问题很关键哦,答案是不,大家想一想,如果这种情况也定义为相似该怎么处理哈。

5. 如果字符串有空串,或者长度相等还有可能相似吗?

6. 大小写敏感吗?(当然敏感)

好了,我们在上述问题的基础上,重新定义一下问题,然后寻求解法。其实我们的问题是,有两个非空的字符串,如果他们的模式完全匹配,我们认为相似,否则都不相似。如“abba”与“ceef”不相似,但是“abbaaf”与“ceeccg”是相似的。

大家看图哈:

a

b

b

a

a

f

c

e

e

c

c

g

a - c匹配, b - e 匹配, f - g 匹配。这样是不是就能回答“abba”与“ceef”不相似了哈。

所以我们需要什么数据结构呢?映射对吧?那么,Hash,Dictionary, 甚至二维数组都可以对吧。

那我们一块看下代码:

 public static bool IsSimilar(string str1, string str2)
        {
            if (!string.IsNullOrEmpty(str1) && !string.IsNullOrEmpty(str2))
            {
                if (str1.Length == str2.Length)
                {
                    Hashtable hash = new Hashtable();

                    for (int index = 0; index < str1.Length; index++)
                    {
                        if (hash.ContainsKey(str1[index]))
                        {
                            if (str2[index] != (char)hash[str1[index]])
                            {
                                return false;
                            }
                        }
                        else
                        {
                            hash.Add(str1[index], str2[index]);
                        }
                    }

                    return true;
                }
            }
            return false;
        }

一块来测试一下:


好了,大家如果有更好的解法,欢迎提出来我们一起讨论哈。也欢迎大家关注我们的视频教程。

算法与数据结构

算法与数据结构-微软经典面试题

关注我们的公众号,加入QQ群讨论:

 

阅读更多

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