C语言输出唯一的子串

 题目描述

给一个字符串,求长度为m的所有不重复的子串。 比如字符串"aaab",我们求长度为2的子串,那么依次为"aa","aa","ab",那么不重复的子串为"aa","ab"

输入

第一行是一个整数K,表示样例的个数。 每个样例的第一行是一个整数m,表示所求子串的长度。 第二行是一个字符串,字符串全部由小写英文字母组成,长度不超过100。

输出

按字典序输出所有不重复子串,每个样例最后输出一个空行。

样例输入

aaab 

aaab

样例输出

aa 

ab  

aaa 

这道题可以定义一个二维数组用来存放字符串的所有子串,然后排序,最后一个个输出,遇到相同的只输出一个。

完整代码

#include <stdio.h>
#include <string.h>

int main()
{
    int k,i,j,len,n,l,m;
    char str[105]={0},a[102][101]={0},temp[100];
    scanf("%d",&k);
    while(k--)
    {
        n = 0;
        scanf("%d",&m);
        scanf("%s",str);
        len = strlen(str);
        for(i = 0;i <= len-m;i++)
        {
            l = 0;
            for(j = i;j < i+m;j++,l++)
            {
                a[n][l] = str[j];//子串
            }
            n++;
        }
        for(i = 0; i < n; i++)//排序
        {
            for(j = i+1; j < n; j++)
            {
                if(strcmp(a[i],a[j])>0)
                {
                    strcpy(temp,a[i]);
                    strcpy(a[i],a[j]);
                    strcpy(a[j],temp);
                }
            }
        }
        for(i = 0;i < n;i++)
        {
            if(strcmp(a[i],a[i+1])==0)//相同的只输出第一个
            continue;
            for(j = 0;j < m;j++)
            printf("%c",a[i][j]);
            printf("\n");
        }
        printf("\n");
        memset(str,'\0',sizeof(str));
        memset(a,'\0',sizeof(a));
        memset(temp,'\0',sizeof(temp));
    }
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c语言输出字符串中最大对称子串长度的3种解决方案

    问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:"avvbeeb",该字符串中最长的子字符串是"beeb",长度为4,因而输出为4. 解决方法:中序遍历 一,全遍历的方法: 1.全遍历的方法,复杂度O(n3); 2.遍历原字符串的所有子串,然后判断每个子串是否对称: 实现方法是:我们让一个指针i从头至尾遍历,我们用另一个指针j从j=i+1逐一指向i后面的所有字符.就实现了原串的所有子串的遍历(子串为指针i到j中间的部分);最后判断得到的

  • C语言求两个字符串的最长公共子串

    本文实例讲述了C语言求两个字符串的最长公共子串的方法.分享给大家供大家参考.具体实现方法如下: #include "stdio.h" #include "string.h" #include "stdlib.h" void getCommon(char str1[],char str2[],char * str3); int stringLength(char * str); void main(){ char str1[50]; char st

  • C语言输出唯一的子串

     题目描述 给一个字符串,求长度为m的所有不重复的子串. 比如字符串"aaab",我们求长度为2的子串,那么依次为"aa","aa","ab",那么不重复的子串为"aa","ab" 输入 第一行是一个整数K,表示样例的个数. 每个样例的第一行是一个整数m,表示所求子串的长度. 第二行是一个字符串,字符串全部由小写英文字母组成,长度不超过100. 输出 按字典序输出所有不重复子串,每个样例

  • 使用c语言输出杨辉三角形的简单方法

    问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)^n的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. 下面给出了杨辉三角形的前4行: 1 1 1 1 2 1 1 3 3 1 下面要求用户输入一个整数n,然后输出杨辉三角形的前n行. 示例代码如下: #include<stdio.h> int main() { int a[100][100],i,j,num; printf("请输入需要打印的行数:"); scanf(&qu

  • 如何利用C语言输出3D立体感心形图详解

    目录 ★头文件部分: ★主函数外自定义函数部分: ★主函数部分: 总结 首先我先在每行(除空白以及{}外)代码上标上序号(无序号源码放在了文末) #include <stdio.h> #include <math.h> float f(float x, float y, float z) { float a = x*x + 9.0f/4.0f*y*y + z*z - 1; return a*a*a - x*x*z*z*z - 9.0f/80.0f*y*y*z*z*z; } floa

  • C语言输出任意边长的菱形

    目录      1.简单理解星号输出原理,将输出星号代码分为上方和下方两部分      2.上方输出星号代码      3.下方输出星号代码 全部代码如下         经过一段时间的学习后,想必大家都已经开始摩拳擦掌,迫不及待地想用C语言写一些程序了.         那么今天,我们就来学习C语言中常见的例子--输出任意边长的菱形         适用范围:学习并掌握了C语言循环以及之前的内容                  上面图片中用黄色a标示出来的便是菱形的边长,图片中为3,当然,也

  • C语言输出孪生素数的实现示例

    目录 1.题目内容: 2.输入格式: 3输出格式: 1.题目内容: 孪生素数是指间隔为 2 的相邻素数,例如最小的孪生素数对是3和5,5和7也是(5虽重复但算作2组). 2.输入格式: 输入N,找出2至N之间的孪生素数的组数. 这里要注意输入的N不要超过int表示的最大范围了 3输出格式: 输出2至N之间的孪生素数,然后输出组数. 代码如下: #include<stdio.h> int Function(int n)//函数判断是否为素数 {     for (int i=2; i<n;

  • C语言输出教学日历表的方法实例

    按照格式分别输入学期,开学时间,总周数即可得到课程表,以回车结束. eg. 学期:2021-2022_2 开学时间:2021/11/25 总周数:20 输出结果 #include<stdio.h> #include<windows.h> int Weekdayofyear(int year); int Isprime(int year); int Days(int year, int mouth); int Weekday(int year, int mouth, int day)

  • C语言输出旋转后数组中的最小数元素的算法原理与实例

    问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.      思路:这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(n).但这个思路没有利用输入数组的特性.既然有时间复杂度更小的算法,我们容易想到二分查找,因为它的时间复杂度为O(logn).这个问题是否可以运用二分查找呢?答

  • C语言实现输出平均成绩最高学生的信息

    目录 列: 有n个结构体变量,内含学生的学号,学号,和三门成绩.要求输出平均成绩最高学生的信息(包括学号.姓名.三门课程成绩和平均成绩) 解题思路: 将n个学生的数据表示为结构体数组(有n个元素).按照功能函数化的思想,小林分别用3个函数来实现不同的功能. 源代码演示: #include<stdio.h>//头文件 #define N 3//宏定义 struct student //学生类结构体 { int num; //学号 char name[20];//姓名 float score[3]

  • 使用C语言如何输出逆序数

    目录 题目内容: 第一种写法 第二种写法 C语言输入一个任意长度的整数,将其逆序输出 总结 题目内容: 从键盘任意输入一个3位整数,编程计算并输出它的逆序数(忽略整数前的正负号).例如,输入-123,则忽略负号,由123分离出其百位1.十位2.个位3,然后计算3100+210+1 = 321,并输出321. 第一种写法 #include<stdio.h> #include<math.h> int main() { int a,b,c,num,ans; printf("In

随机推荐