常用算法C#实现:字符串包含问题

来源:互联网 发布:c语言创建目录函数 编辑:程序博客网 时间:2024/06/06 05:35

题目描述:给定两个字符串:strA = ABDcakjeOJPCK,strB = kjeO, 请给出尽可能快方法来判断出 strB中的每个字母是否均包含在strA中。

方案一:利用哈希表的方法

算法步骤描述:
(1)创建一个包含52个大小写字母的哈希表并初始化为0,定义散列函数为:f(x) = x - ‘a’;
(2)遍历并求解短字符串中每个字母的哈希值,并将其存到哈希表中;
(3)遍历并求解长字符串的每个字符哈希值,检查是否包含短字符串的所有哈希值,以此来判断段字符串是否包含在长字符串中;

程序实现:`

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Algorithms{    class Program    {        public static bool IsStringExist(string stra, string strb)        {            bool result = false;            int[] hashTable = new int[58];//创建哈希表,C#中默认初始化值为0,由于在ascii表中                                          //字母Z与字母a之间还有字符:[、\、]、^、_、`,                                          //故为了简单起见设哈希表大小为58            int count = strb.Length;            for (int i = 0; i < strb.Length; i++)            {                int index = strb[i] - 'A';                hashTable[index] = 1;            }            for (int j = 0; j < stra.Length; j++)            {                int index = stra[j] - 'A';                if (hashTable[index] == 1)                {                    count--;                    if (count == 0)                    {                        result = true;                        break;                    }                }              }            return result;        }        static void Main(string[] args)        {            string a = "ABDcakjeOJPCK";            string b = "jeOJ";            string c = "JPCKv";            Console.WriteLine("{0}", IsStringExist(a, b));            Console.WriteLine("{0}", IsStringExist(a, c));            Console.ReadKey();        }    }}

算法复杂度:O(n+m)

方案二:利用素数法求解

算法步骤描述:
(1)为大小写字母A-Za-z建立一个与之一一对应的素数表,如:A对2,B对3,……,以此类推;
(2)遍历strA(长字符串)并求得其所有字母对应素数的乘积X;
(3)遍历strB(短字符串),用其每个字母对应的素数去除(2)中求得的X,若有一个字母对应的素数不能整除X,则返回false,退出;若所有字母对应的素数均能整除X,则返回true;

程序实现:与方案一类似(略);

0 0
原创粉丝点击