子字符串_c语言 子字符串 - CSDN
精华内容
参与话题
  • 输出字符串的子串

    千次阅读 2018-08-16 17:25:49
    我们经常碰到这样一个问题,怎样快速输出一个字符串的子串,这种问题通常有两种形式: (1)输出连续子串 例如:假设字符串的长度为n,其非空子串的数目为你n(n+1)/2个。例如字符串“abc“的连续子串有 a,b,c,ab,...

         我们经常碰到这样一个问题,怎样快速输出一个字符串的子串,这种问题通常有两种形式:

    (1)输出连续子串

    例如:假设字符串的长度为n,其非空子串的数目为你n(n+1)/2个。例如字符串“abc“的连续子串有 a,b,c,ab,bc,abc,利用代码实现就有

    这个其实比较简单,下面我们来看一下另一种形式。

    (2)输出所有的子序列

    假设字符串的长度为n,其非空子串的数目为2^n-1个(注意这里包含不连续的子串哦)。还是以“abc”为例,其所有子序列为a,b,c,ab,ac,bc,abc.输出代码如下:

    #include<iostream>
    #include<string.h>
    #include<vector>
    #include<string>
    using namespace std;

    case 1
    void combine(const char str[])
    {
        if(str==nullptr||*str==0)
            return;
        const int MAX=64;
        int len=strlen(str);
        bool used[MAX]={0};
        char cache[MAX];
        char *res=cache+len;
        *res=0;
        while(1)
        {
           int index=0;
           while(used[index])
           {
              used[index]=false;
              ++res;
              if(++index==len)
                  return ;
           }
           used[index]=true;
           *--res=str[index];
           printf("%s ",res);
        }

    }


    case 2
    void suoyou(char str[])
    {
        int len=strlen(str);
        int num=1<<len;
        vector<string>ve;
        for(int i=1;i<num;i++)
        {
           string ss;
           for(int j=0;j<len;j++)
           {
              if(i&(1<<j))   ss.push_back(str[j]);
           }
           ve.push_back(ss);
        }

        for(int k=0;k<ve.size();k++)
        {
           cout<<ve[k]<<endl;
        }

    }


    int main()
    {
        char str[100];
        cin>>str;
        combine(str);
        printf("\n");
        suoyou(str);
        return 0;
    }
    输出结果:

    推荐你用第二种方法,相信这会让面试官眼前一亮的。

    是不是很简单,在对字符串操作很多时候都会涉及到所有子串问题,所以掌握好它。

    attention::子串指的是串中任意个连续的字符组成的子序列,称为该串的子串。

                          而子序列可以是不连续的!!!

    展开全文
  • C++中在字符串中提取子字符串

    千次阅读 2019-08-15 15:53:43
    C++中在字符串中提取子字符串 从字符串中提取子字符串是指将一个字符串中的一部分截取下来形成一个新的字符串。 #include <iostream> int main(int argc,const char* argv[]) { std::string str1 = "Hello...

    C++中在字符串中提取子字符串

    从字符串中提取子字符串是指将一个字符串中的一部分截取下来形成一个新的字符串。

    #include <iostream>
    
    int main(int argc,const char* argv[])
    {
    	
    	std::string str1 = "Hello World!";
    	/*
    	定义一个新的字符串str2,其内容被初始化成字符串str1的第0个字符开始的连续6个字符。
    	第二个参数是从第一个参数的第几个字符开始截取,第三个参数是连续截取几个字符
    	*/
    	std::string str2(str1,0,6);
    	std::cout << str2 << std::endl;
    
    	/*
    	以下是在字符串str1中截取地6个字符开始的连续6个字符作为一个新的字符串,赋值给str3.
    	第一个参数是从str1的第几个字符开始截取,第二个参数是连续截取几个字符
    	*/
    	std::string str3 = str1.substr(6,6);
    	std::cout << str3 << std::endl;
    
    	return 0;
    }
    
    展开全文
  • 编写一个函数,它从一个字符串中提取一个子字符串。函数原型如下: int substr(char dst[], char src[],int start, int len) {} 目标是:从src数组起始位置向后偏移start个字符的位置开始,最多复制len个非NULL字符...

    例如:

    编写一个函数,它从一个字符串中提取一个子字符串。函数原型如下:
    int substr(char dst[], char src[],int start, int len)
    {}
    目标是:从src数组起始位置向后偏移start个字符的位置开始,最多复制len个非NULL字符到dst数组。
    在复制完毕之后,dst数组必须以NULL字节结尾。函数的返回值是存储于dst数组中的字符串的长度。

    首先确定要提取的子字符串的长度,用指针指向该字符地址,这时需要判断剩余字符长度是否比len长,如果少于len则需让len等于n。

    这时就可以复制src字符串中的字符到dst中,最后由于要求dst末尾以NULL结尾,所以让其末尾为‘\0’。

    最后返回dst中字符串的长度!

    代码实现如下:

    #include<stdio.h>
    #include<string.h>
    
    int substr(char dst[],char src[],int start,int len)
    {
    	char* p = src + start;   //定义指针变量指向需要提取的字符的地址
    	int n = strlen(p);       //求字符串长度
    	int i = 0;
    		if(n < len)
    		{
    			len = n;
    		}
    		while(len != 0)
    		{
    			dst[i] = src[i+start];
    			len --;
    			i++;
    		}                        //复制字符串到dst中
    		dst[i] = '\0';
    	return 0;
    }
    int main()
    {
    	char dst[15];
    	char src[] = "ret_is_good_boy!";
    	substr(dst,src,5,19);
    	printf("%d\n",strlen(dst)+1);      //输出dst字符串的长度
    	printf("%s\n",dst);                //输出提取出来的字符串
    	return 0;
    }
    结果如下:

    展开全文
  • 两个字符串的最大公共子串(七)

    万次阅读 2019-05-09 19:44:07
    东家蝴蝶西家飞,白骑少年今日归。 愿,所有迷茫的人,都不再迷茫的,愿,所有努力工作的人,...有两个字符串,这两个字符串可能会存在公共的部分,如字符串"abcdef" 和字符串"defg",这两个字符串之间有共同的字符串...

    东家蝴蝶西家飞,白骑少年今日归。 愿,所有迷茫的人,都不再迷茫的,愿,所有努力工作的人,都可以得到应有的回报,愿,所有的人,都可以找到回家的方向,愿,再无苦痛,再无离别。
    上一章简单介绍了统计字符串中各个字符出现的次数(六),如果没有看过,请观看上一章

    一. 最大公共子串

    有两个字符串,这两个字符串可能会存在公共的部分,如字符串"abcdef" 和字符串"defg",这两个字符串之间有共同的字符串,“d”,“e”,“f”,“de”,“ef”,“def” 等。最长的公共子串就是"def"。

    二.第一种思路,循环找寻

    	// 如,传递的参数为 "abcdef" 和"defg"
    	public static String getMaxSubString(String maxString,String minString){
    		String max=null; //并不知道哪个字符串长,哪个字符串短。
    		String min=null;
    		//1。 先找到最大的字符串和最小的字符串。 根据长度进行比较
    		max=maxString.length()>minString.length()? maxString:minString;
    		min=maxString.equals(max)?minString:maxString;
    		
    		//2. 求出最小的那个的长度。 根据这个长度,进行相应的循环。
    		int minLength=min.length();
    		//3.如果整个包含的话,那个就不用循环判断了。
    		if(max.contains(min)){
    			return min;
    		}
    		//3.开始进行相关的循环操作了。
    		for (int i = 0; i <minLength; i++) { //从最小的开始循环。
    			// 从开头处开始,最后的位置是minLength; 因为subString 截取时不到后面的那个参数,所以这里是<=minLength;
    			for(int start=0,end=minLength-i;end<=minLength;start++,end++){
    				/**
    				 * 第一次循环时, 先看整个是否进行了包含,去掉0位,即defg 是否在abcdef 里面。
    				 * 第二次循环时,要把defg 去掉一位,看是否在abcdef 里面。 截取时,有def 和efg 两种。
    				 * 第三次循环时,把defg 去掉两位。 截取有: de ef fg 三种方式。
    				 * 第四次循环时, 把defg 去掉三位,有 d e f g 四种方式。 如果还不存在,则说明没有相同的子串。
    				 * 外层循环 为最小的字符串的长度。 0~ length_1
    				 * 内层循环为: 从0 开始,结束位置为 length-i, 判断是否在,如果不再,则进行整体移动, 为1 ~length-i+1,2~ length-i+2
    				 * 直到 end 结束位置为 length , 因为substring 时不会取出最后的索引值。
    				 * 
    				 */
    				String temp=min.substring(start,end); //截取的那个。
    				if(max.contains(temp)){
    					return temp;
    				}
    			}
    		}
    		return null;
    	}
    

    三. LCS (Longest Common Subsequence) 算法

    参考教程: https://blog.csdn.net/xiehaoyun2012/article/details/12066515
    算法的主要原理为:

    LCS[i,j] = 0 (i<0||j<0)
    LCS(i-1,j-1) (i>=0 && b>0 && (str1[i]==str2[j]))
    (1) 构造一个str1.size()*str2.size()的矩阵vec
    (2) 如果 str1[i] == str2[j],则vec[i][j] = vec[i-1][j-1]+1;

    翻译成中文就是:

    1. 将两个字符串分别以行和列组成矩阵。
      (2) 计算每个节点行列字符是否相同,如相同则为 1。
      (3) 通过找出值为 1 的最长对角线即可得到最长公共子串。
      在这里插入图片描述

    可以进一步的优化:
    我们可以将字符相同节点(1)的值加上左上角(d[i-1, j-1])的值,
    这样即可获得最大公用子串的长度。如此一来只需以行号和最大值为条件即可截取最大子串。
    在这里插入图片描述
    只需要比较 数组里面的最大值即可了。

    程序代码为:

    // 如,传递的参数为 "abcdef" 和"defg"
    	public static String getMaxSubString(String maxString,String minString){
    		//1. 必须保证 第一个字符串的长度是长的。第二个是短的。
    		if(minString.length()>maxString.length()){
    			// 重新调用这个方法
    			return getMaxSubString2(minString, maxString);
    		}
    		//2. 判断一下,是否直接包含,如果是的话,就不用进行阵列转换了。
    		if(maxString.contains(minString)){
    			return minString;
    		}
    		//3. 取出长度,转换相对应的矩阵。 通常,长的为y,短的为x.
    		int maxLength=maxString.length();
    		int minLength=minString.length();
    		// 构建二维数组
    		int [][] conver=new int[minLength][maxLength];
    		int maxValue=0; //最大的值。
    		int maxIndex=0;//最大的索引。
    		//4. 对这个矩阵进行相应的放值。
    		for (int i = 0; i <minLength; i++) {
    			for(int j=0;j<maxLength;j++){
    				//5.判断一下,值是否相同。 如果相同,
    				if(minString.charAt(i)==maxString.charAt(j)){
    					//相同了,看是第几行,第几列。 第1行或者第1列的为1
    					if(i==0||j==0){
    						conver[i][j]=1;
    					}else{
    						conver[i][j]=conver[i-1][j-1]+1; //为左上角的值加1.
    						if(maxValue<conver[i][j]){ // 整个数组的最大值。 也可以是<= < 时表示取第一个,<=为最后一个。(如果存在多个的情况下)
    							maxValue=conver[i][j]; //取出那个最大的值。
    							maxIndex=i; //取出那个最大的列索引。
    						}
    					}
    					
    				}else{
    					conver[i][j]=0;  //如果不相同,为0.
    				}
    			}
    			
    		}
    		//5. 根据最大的索引和最大的值,来判断截取那个最大的子字符串。
    		if(maxValue!=0&&maxIndex!=0){ // 双重判断,如果有值的话。
    			// maxIndex 为2  maxValue 为3.  开始处的值为0, 结束处的值为3 (不包括。)
    			// 变成 值为  2-3+1=0 到3 , 长度为 2*maxValue-maxIndex-1  =2*3-2-1=3 ,因为不包括maxValue所以不+1了。
    			return minString.substring(maxIndex-maxValue+1,maxValue);
    		}
    		return null;
    	}
    

    谢谢!!!

    展开全文
  • 获取字符串中的子串

    千次阅读 2017-07-05 14:22:18
    去除字符串中空格的基本思想:从字符串第一个字符串开始遍历,若遇到空格,就将空格后的字符前移,重复直至遍历到字符串结束。 提取主字符串中的子串的基本思想:使用一字符指针数组,将主字符串中的子串分离出来...
  • 今天好友问到一个问题就是给定一个字符串要求输出它的所有的自字符串,如给定abc,子字符串含有a、b、c、ab、bc、ac、abc;下面给出两种解决方案。 第一种是基于递归来实现的。 public static Set pinjie(Setall,Sets,...
  • 获取子字符串( substring )

    千次阅读 2018-05-15 21:41:38
    import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub String S = "... System.out.println(S.substr...
  • 在字符串中查找子字符串并提取它

    千次阅读 2019-08-13 21:23:28
    在字符串中查找子字符串并提取它 有时候你会想要找出一个较小的字符串是否存在于一个较大的字符串中(我们通常会说一个字符串中存在一个子字符串)。 这可以使用indexOf()方法来完成,该方法需要一个parameter — 你...
  • 子字符串查找之KMP

    2019-08-06 15:22:22
    当我们需要从文档中查找某个关键词时,就用到了子字符串查找技术。比如在某个数据库导出文档中想要查找所有用户的密码,想在一个学长给的word题库中查找你正在做的检测题的答案。就像上边这个表格,我们想要在字符串...
  • 对于以上问题的解决,我一般使用String.indexOf("子串")的方式解决, 请看代码: public class IndexOfTest { public static void main(String[] args) { // TODO Auto-generated method stub ...
  • #定义统计字符串的方法 def calcu_sub_str_num(mom_... print( '打印子字符串:',sun_str) #打印出子字符串 print('打印母字符串长度:',len(mom_str)) #打印出母字符串长度 print( '打印子字符串长度:',len(su...
  • 1、查找当前目录文件名中的字符串: grep 字符串 文件名2、查找某个文件字符串,并输出行号:grep -n 字符串 文件名3、查找当前目录(包含目录)的字符串:grep -r 字符串 *4、查找当前目录(包含目录)的字符串...
  • C/C++库函数strstr和find实现子字符串查找

    万次阅读 多人点赞 2017-05-02 20:07:30
    C/C++库函数strstr和string中find方法实现子字符串查找
  • c++字符串前几位,后几位的截取

    万次阅读 2018-09-17 10:35:59
    substr: 截取开始到结束长度的子字符串,上面的例子截取的是str除去末尾三个字符的剩余子字符串 erase: 表示删除固定长度的字符串,上面的例子是删除字符串开始的五个字符的剩余子字符串。 这两个函数的返回值都是...
  • 返回一个从指定位置开始的指定长度的子字符串。 stringvar.substr(start[,length]) 参数 stringvar 必选项。要提取子字符串的字符串文字或String对象。 start 必选项。所需的子字符串的起始位置。字符串中的第一个...
  • java 截取字符串获取子字符串

    万次阅读 2017-09-14 16:39:43
    两种方法 简单示例1 简单示例2 方法一通过substring方法解决 方法二通过split方法...该子字符串从指定索引处的字符开始,直到此字符串末尾。 substring(int beginIndex,int endIndex) :返回一个新字符串,它是此字符
  • C语言截取从某位置开始指定长度子字符串方法

    万次阅读 多人点赞 2015-03-24 22:17:07
    C语言中没有从某位置开始指定长度子字符串的函数(还是我没找到?),只有从头开始截取的strncat和strncpy,以strncpy为例:char dest[4] = {""}; char src[] = {"123456789"}; strncpy(dest, src, 3); puts(dest); ...
  • 上面两个方法都是从一个字符串中搜索给定的子字符串,然后返回子字符串的位置(如果没有找到子字符串,则返回-1)。这两个方法的区别在于:indexOf()方法从字符串的开头向后搜索子字符串,而lastIndexOf()方法是从...
  • //功能:用c语言实现在母字符串中查找子字符串出现的次数 //分析:从母字符串中的第一个字符开始寻找与子字符串第一个字符相同的子串 //然后从第二个字符开始,直到母字符串结束 //测试用例: 母字符串aaaaaaaaaaaa ...
  • Python判断字符串是否包含子字符串

    万次阅读 2019-12-23 10:10:10
    Python如何判断一个字符串是否包含指定字符串?本文介绍Python判断一个字符串是否包含指定子串的4种方法。具有一定的借鉴价值。 第一种 使用in运算符 最简单的方法是通过python的 in 运算符 str = "Everyone has...
1 2 3 4 5 ... 20
收藏数 849,088
精华内容 339,635
关键字:

子字符串