查找两个字符串的最长公共子串(附源码)_AX

查找两个字符串a,b中的最长公共子串
【思路】遍历a的字符,每次取出一个字符与b进行匹配(遍历b),如匹配上,a,b同时后移一个字符,再循环遍历b进行匹配,直到匹配不上,把刚才匹配的公共字串与已知最长子串进行比较,如果它比最长子串还长,替换最长子串,如相等,也保存.

【缺陷】本来优化了一下,减少了些不必要的循环次数,结果发现如果没有公共子串就会出现数组越界问题,可以改一下判断条件,但整个结构就会感觉很乱就删除了,只剩了一句做为注释掉,大家可以自己优化一下.

【总结】本来思路很简单,但调试起来还是用了很多时间,主要是因为变量初始化放的位置不对. 相对菜鸟而言,思路跟代码实现还是有段距离的.
【源码】
 1 None.gif using  System;
 2 None.gif using  System.Collections;
 3 None.gif namespace  CompareString_AX
 4 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
 6InBlock.gif    /// Class1 的摘要说明。
 7ExpandedSubBlockEnd.gif    /// </summary>

 8InBlock.gif    class Class1
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
10ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
11InBlock.gif        /// 应用程序的主入口点。
12ExpandedSubBlockEnd.gif        /// </summary>

13InBlock.gif        [STAThread]
14InBlock.gif        static void Main(string[] args)
15ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
16InBlock.gif            string a="AX_skljfgfdeerterter";//12315aaa1aaaa1211213412222";
17InBlock.gif            string b="AX_weesdfsdee1";//31222aaaa1aaa1113412222";
18InBlock.gif            ArrayList AX=Compare(a,b);
19InBlock.gif            foreach(string i in AX)
20ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
21InBlock.gif                Console.WriteLine("最长的子串为:"+i);
22ExpandedSubBlockEnd.gif            }

23InBlock.gif            Console.ReadLine();
24ExpandedSubBlockEnd.gif        }

25InBlock.gif        public static ArrayList Compare(string a,string b)
26ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{                        
27InBlock.gif            ArrayList arr=new ArrayList();
28InBlock.gif            arr.Add("");
29InBlock.gif            //循环遍历字符串a
30InBlock.gif            for(int i=0;i<a.Length;i++)
31ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{                                
32InBlock.gif                //在字符串b中查找从匹配上a[i]开始的子串
33InBlock.gif                //优化循环次数(有点问题)for(int j=0;j<b.Length-arr[0].ToString().Length+1;j++)
34InBlock.gif                for(int j=0;j<b.Length;j++)
35ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
36InBlock.gif                    int n=1;//计数器
37InBlock.gif                    string subTemp="";//保存匹配上的临时子串
38InBlock.gif                    char tempa=a[i];
39InBlock.gif                    char tempb=b[j];
40InBlock.gif                    //匹配上后,两字符串的字符同时后移一位,再进行匹配,直到匹配不上
41InBlock.gif                    while(tempa==tempb)
42ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
43InBlock.gif                        subTemp+=tempa;
44InBlock.gif                        if((i+n)<a.Length&&(j+n)<b.Length)
45ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
46InBlock.gif                            tempa=a[i+n];
47InBlock.gif                            tempb=b[j+n];
48InBlock.gif                            n++;
49ExpandedSubBlockEnd.gif                        }

50InBlock.gif                        else
51ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
52InBlock.gif                            break;
53ExpandedSubBlockEnd.gif                        }

54ExpandedSubBlockEnd.gif                    }

55InBlock.gif                    //比较子串与临时子串的长度
56InBlock.gif                    if(subTemp.Length>arr[0].ToString().Length&&subTemp.Length!=0)
57ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
58InBlock.gif                        arr.Clear();
59InBlock.gif                        arr.Add(subTemp);
60ExpandedSubBlockEnd.gif                    }

61InBlock.gif                    else if(subTemp.Length==arr[0].ToString().Length&&subTemp.Length!=0)
62ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
63InBlock.gif                        arr.Add(subTemp);
64ExpandedSubBlockEnd.gif                    }

65ExpandedSubBlockEnd.gif                }

66ExpandedSubBlockEnd.gif            }

67InBlock.gif            //设置返回值            
68InBlock.gif            if(arr[0].ToString().Length!=0)
69ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
70InBlock.gif                return arr;
71ExpandedSubBlockEnd.gif            }

72InBlock.gif            else
73ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
74InBlock.gif                arr.Clear();
75InBlock.gif                arr.Add("没有共同的子串!");
76InBlock.gif                return arr;
77ExpandedSubBlockEnd.gif            }

78ExpandedSubBlockEnd.gif        }

79ExpandedSubBlockEnd.gif    }

80ExpandedBlockEnd.gif}

81 None.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值