数据结构和算法--字符串查找

数据结构和算法

  • 排序算法:
    • 非线性时间排序
      • 比较排序
        1. 冒泡排序
        2. 快速排序
      • 插入排序
        1. 插入排序
        2. 希尔排序
      • 选择排序
        1. 选择排序
        2. 堆排序
      • 归并排序
        1. 二路归并排序
        2. 多路归并排序
    • 线性时间排序
      9. 计数排序
      10. 堆排序
      11. 基数排序
  • 字符串查找

    1. 子字符串查找

    从目标串pStr中查找pFindStr,如果有,返回位置下标
    eg:
    pStr:adcdbcae
    pFindStr:dbca

    1. 第一种实现方法
      string::size_type string::find(string &);

    功能为在string对象中,查找参数string类型的字符串是否存在,如果存在,返回起始位置。不存在则返回 string::npos。

    	#include <string>
    
    	int FindStr(string a, string b)
    	{
        	string::size_type idx;
    	    idx=a.find(b);//在a中查找b.
    	    if(idx == string::npos )//不存在。
    	    {
    	        return (int)idx;
    	    } 
    	    return -1;
    	}
    
    1. 第二种实现方法
      在C语言中,字符串存储为字符数组,以’\0’结束。 在C的接口中,有strstr函数,可以在字符串中查找另一个字符串。
      char * strstr(const char *str1, const char *str2);
      功能为在str1中查找str2,如果存在,那么返回查找到的起始指针,否则返回NULL。
    int FindStr(char* pStr, char* pFindStr)
    {
    	char* pPos = strstr(pStr, pFindStr);
    	if (!pPos)
    	{
    		return -1;
    	} 
    	
    	char* ptr = pstr;
    	int pos = 0;
    	while(ptr)
    	{
    		if(pPos == ptr)
    			return pos;
    		ptr++;
    		pos++ 
    	}
    }
    
    1. 第三种实现方法
    int FindStr(char* pStr, char* pFindStr)
    {
    	// 异常情况判断
    	if(!pStr || !pFindStr)
    		return -1;
    
    	char* p1 = pStr;
    	char* p2 = pFindStr;
    	char* p3 = NULL;
    	int pos = 0;
    	while(p1)
    	{
    		// 第一个字符相同,比较剩余字符
    		if(*p1 == *p2)
    		{
    			p3 = p1;
    			while(!p3 && !p2)
    			{
    				if(*p3 != *p2)
    					break;
    				p3++;
    				p2++;
    			}
    			// 查看遍历是否完成
    			if(!p2)
    			{
    			  return pos;
    			} else {
    				// 重置指针
    				p2 = pFindStr;
    			}
    		}
    		p1++;
    		pos++;
    	}
    }
    

    2. 相同字符串查找

    从两个字符串中找到相同的最大长度的子串,并返回。
    eg:
    str1:hello word amazing!!!
    str2:nihao=hello amazing
    思路:
    输入两个字符串,由短字符串的长度决定比较次数。
    每次比较一个字符,从短字符串的第一个依次与长字符串的每一个字符比较,若出现相同的字符,则两个字符串各自取下一位进行比较,直到出现不相同字符的为止。(同时要注意比较是不能超出短字符串的长度,不然会出现未知后果)

    string   FindMAxSubString( string a ,string b)
    {
         string res = "";
         string shorter = a.length()>b.length()? b:a;
         string longer = a.length()>b.length()? a:b;
     
         int maxlen =0;
         int maxpos =-1;
         for(int i =0; i<shorter.length();i++){
            for(int j =0;j<longer.length();j++)
            {
                if(shorter[i]==longer[j])
                {
                    int k =1;
                    for(;(shorter[i+k]==longer[j+k])&& i+k<shorter.length();k++);
                    if(k>maxlen){
                        maxpos =i;
                        maxlen =k;
                    }
                }
            }
         }
     
         if(maxpos==-1)
            return res;
         else
         {
             res=shorter.substr(maxpos,maxlen);
             return res;
         }
     
    }
    
    发布了59 篇原创文章 · 获赞 22 · 访问量 9万+

    猜你喜欢

    转载自blog.csdn.net/Martin_chen2/article/details/90727003