列表

详情


OR69. 字符串组合

描述

输入一个字符串,输出该字符串中相邻字符的所有组合。
举个例子,如果输入abc,它的组合有a、b、c、ab、bc、abc。(注意:输出的组合需要去重)(40分)

输入描述

一个字符串

输出描述

一行,每个组合以空格分隔,相同长度的组合需要以字典序排序,且去重。

示例1

输入:

bac

输出:

a b c ac ba bac

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 232KB, 提交时间: 2019-06-05

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

void Gstr(char s[1000], int i, int len);

int main(){
    char s[1000];
    scanf("%s",s);
    int len= strlen(s);
    int i;
    for(i=1; i<=len; i++)
        Gstr(s, i, len);
    return 0;
}

void Gstr(char s[1000], int n, int len){
    char *s1[1000];
    char *s2[1000];
    int k=0, j=0, i=0;
    while(j<=len-n)
    {
        s1[k]= (char*)malloc(sizeof(char*) * 1);
        strncpy(s1[k],&s[j],n);
        s1[k][n]='\0';
        k++;
        j+=1;
    }
  
    s2[0]=s1[0];
  
    // 去重,每个元素与之前的若干元素比较。。。
    int p=1;
    for(i=1;i<k;i++)
    {
        for(j=0;j<i;j++)
        {
            if(strcmp(s1[i],s1[j])==0)
                break;
            if(strcmp(s1[i],s1[j])!=0)
                continue;
        }
        if(i==j)
        {
            s2[p]=s1[i];
            p++;
        }
    }
    char* t;
   // 排序
    for(i=0;i<p-1;++i)
    {
        for(j=i+1;j<p;++j)
        {
            if(strcmp(s2[i],s2[j])>0)
            {
                t=s2[i];
                s2[i]=s2[j];
                s2[j]=t;
            }
        }
    }
    for(i=0;i<p;++i)
        printf("%s ",s2[i]);
}

C 解法, 执行用时: 2ms, 内存消耗: 232KB, 提交时间: 2019-04-30

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void zuhe(char s[1000],int n,int len);
char a='a';
int main()
{
    char str[1000];
    scanf("%s",str);
    int len=strlen(str);
    int i;
    for(i=1;i<=len;i++)
    {
        zuhe(str,i,len);
    }
    return 0;
}
void zuhe(char s[1000],int n,int len)
{
    int j=0;
    char *s1[1000];
     
    char *s2[1000];
    int k=0;
    int i=0;
    while(j<=len-n)
    {
        s1[k]= (char*)malloc(sizeof(char*) * 1);
        strncpy(s1[k],&s[j],n);
        s1[k][n]='\0';
        k++;
        j+=1;
    }
 
    s2[0]=s1[0];
 
    int p=1;
    for(i=1;i<k;i++)
    {
        for(j=0;j<i;j++)
        {
            if(strcmp(s1[i],s1[j])==0)
            {
                break;
            }
 
            if(strcmp(s1[i],s1[j])!=0)
            {
                continue;
            }
         
        }
        if(i==j)
        {
         
            s2[p]=s1[i];
            p++;
        }
 
 
    }
    char*t;
 
    for(i=0;i<p-1;++i)
    {
        for(j=i+1;j<p;++j)
        {
            if(strcmp(s2[i],s2[j])>0)
            {
                t=s2[i];
                s2[i]=s2[j];
                s2[j]=t;
            }
        }
    }
    for(i=0;i<p;++i)
    {
        printf("%s ",s2[i]);
 
 
    }
}

上一题