获取两个字符串中最长相等的字符串

获取两个字符串中最长相等的字符串

例:“likeyou”和“loveyou” 输出“eyou”

前段时间面试遇到的面试题,当时的想法是首先将字符串拆分成字符数组,然后拿两个数组去做比较,可惜由于基础不是很扎实,当时的for循环比较写成了这个样子

for (int i = 0; i < arrStr1.length; i++)
{
    for (int j = 0; j < arrStr2.length; j++)
    {
        if (arrStr1[i] == arrStr2[j + cnt])
        {
            str += arrStr1[i].ToString();
            cnt++;
            break;
        }
        else{
            continue;
        }
    }
}

感觉有问题但是当时又想不到问题出在哪,然后连面试的机会也没有了。。。=_=


后来发现自己当时的问题是随意改变了外层for循环的指向,导致后边循环的乱套了。。。。

现在的理解思路是,首先要保证arrStr1的指向不变,然后挨个去和arrStr2数组的每一个值去做比较,如果相等,就拿arrStr1的下一个值来和arrStr2的下一个值比较(问题就在这里,不应该通过循环外层的for循环来让arrStr1获取下一个值,而是应该让arrStr1的指向不变,通过i+cnt来获取下一个值),如果不相等,那么循环外层for循环,改变arrStr1的指向来获取数组的下一个值,然后重复上边的比较操作,最后经过些许完善得出下面的方法

 public static string Show(string CompareStr1, string CompareStr2)
{
    //将两个字符串拆分成字符数组 使用ToCharArray方法
    var arrStr1 = CompareStr1.ToCharArray();
    var arrStr2 = CompareStr2.ToCharArray();
    List<CompareResult> list = new List<CompareResult>();
    var str = "";
    var cnt = 0;
    for (int i = 0; i < arrStr1.Length; i++)
    {
        str = "";
        cnt = 0;
        if (!arrStr2.Any(o => o == arrStr1[i]))
        {
            continue;
        }
        for (int j = 0; j < arrStr2.Length; j++)
        {
            if (i + cnt >= arrStr1.Length)
            {
                i = arrStr1.Length;
                break;
            }
            else if (arrStr1[i + cnt] == arrStr2[j])
            {
                str += arrStr1[i + cnt].ToString();
                cnt++;
            }
            else
            {
                if (cnt > 0)
                {
                    break;
                }

            }
        }

        list.Add( new CompareResult { KeyStr = str, KeyCount = cnt });
    }
        var result = list.OrderByDescending(o=>o.KeyCount).FirstOrDefault();
        return result.KeyStr;
}

//定义一个类,用来存放紧邻字符的相同字符串以及其字符个数
 public class CompareResult
{
    public string KeyStr{ get; set; }
    public int KeyCount { get; set; }
}

原文地址:https://www.cnblogs.com/wangxiaojun1/p/11406224.html

时间: 2024-10-04 02:45:13

获取两个字符串中最长相等的字符串的相关文章

javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除splice(需明确位置) 9.数组遍历 10.jQuery根据元素值删除数组元素的方法 数组常见操作包含了 增.删.查.改.插入.交集.并集 1.数组整体元素修改 //map,给数组每个元素加1 输出[1,2,3] $.map([0,1,2],function(n){ return n+1; })

请编写程序,统计键盘录入的字符串中出现了几次字符串”java”,并测试

import java.util.Scanner;public class StringBufferText {//main方法public static void main(String[] args) {br/>@SuppressWarnings("resource")//键盘录入Scanner sc=new Scanner(System.in);//字符串数据的导入System.out.println("请您输入一个字符串:");String str=s

找出n个字符串中出现次数最多的字符串。

1. 找出n个字符串中出现次数最多的字符串. C/C++: char* find(char **data,int n); Java: String find(String data[]); 说明: 1. data是字符串数组,n是数组中字符串的个数,返回值为出现次数最多的字符串. 2. 若结果有多个,返回任意一个即可 3. 不得使用任何库函数/API,如需使用类似功能, 请自行实现 4. 算法效率尽可能高,尽量少的使用内存空间 5. 必须要有代码注释和算法说明. 例如:data里面的数据是{“p

用C#通过正则表达式截取字符串中符合条件的子字符串

仅仅作为简单的记录,不多说直接上代码(仅测试使用): private void Test() { Regex ConnoteA = new Regex("^[a-zA-Z]\\d{8}$"); Regex ConnoteAA = new Regex("^[a-zA-Z]{2}\\d{7,10}$"); Regex ConnoteAAA = new Regex("^[a-zA-Z]{3}\\d{5,9}$"); Regex ConnoteAAAA

python_取出字符串中出现2次的字符串

#取出字符串中出现2次的字符串,使用count方法统计def two_zifuchuan(str): s=set() for i in str: if str.count(i)==2: s.add(i) return s #取出字符串中出现2次的字符串,使用字典统计 def two_occur(str): s={} for i in str: if i in s.keys(): s[i]+=1 else: s[i]=1 return [i for i in s if s[i]==2] str="

hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31611    Accepted Submission(s): 11618 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

Python初学者笔记(3):输出列表中的奇数/奇数项,字符串中的偶数项,字符串大小写转换

[1]a=[8,13,11,6,26,19,24]1)请输出列表a中的奇数项2)请输出列表a中的奇数 解:1) 1 a=[8,13,11,6,26,19,24] 2 print a[::2] Result:>>>[8, 11, 26, 24] 2) 1 a = [8,13,11,6,26,19,24] 2 b = [] 3 for item in a: 4 if item%2 !=0: 5 b.append(item) 6 else: 7 continue 8 print b Resul

我的Java开发学习之旅------&gt;求字符串中出现次数最多的字符串以及出现的次数

金山公司面试题:一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出. 此题的解题思路如下: 引入TreeSet:通过集合快速找到所有出现过的字符串 引入ArrayList:为了快速排序,再通过StringBuffer生成排序后的字符串 通过String的indexOf方法和lastIndexOf方法来计算每个字符串出现的次数最大值 使用HashMap

C#判断字符串中是否包含一个子字符串是可以直接使用Contains()方法

1. 以前判断一个字符串中是否包含另一个子字符串时,习惯使用 IndexOf(); string str = "[email protected]"; if(str.IndexOf("@")>=0){ //any other code } 2. 后来发现,原来C#中还定义了Contains()这样的方法,使用如下: String abc = "[email protected]@"; bool result = abc.Contains(&