列表

详情


BD12. 最大子序列

描述

对于字符串x和y, 如果擦除x中的某些字母(有可能全擦掉或者都不擦)能够得到y,我们就称y是x的子序列。例如."ncd"是"nowcoder"的子序列,而"xt"不是。
现在对于给定的一个字符串s,请计算出字典序最大的s的子序列。

输入描述

输入包括一行,一个字符串s,字符串s长度length(1 ≤ length ≤ 50). s中每个字符都是小写字母

输出描述

输出一个字符串,即字典序最大的s的子序列。

示例1

输入:

test

输出:

tt

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-08-21

#include<stdio.h>

int main(void){
    char a[50] = {0};
    char b[50] = {0};
    
    scanf("%s", &a);
    int n = strlen(a);
    int i, j, k = 1;
    b[0] = a[0];
    for (i = 1; i < n; i++){
        for (j = 0; j < k; j++){
            if (a[i] > b[j]){
                b[j] = a[i];
                b[j+1] = '\0';
                k = j+1;
            }else if (j == k-1){
                b[k++] = a[i];
                b[k] = '\0';
                break;
            }
        }
    }
    
    printf("%s\n", b);
}

C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2018-08-09

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
char ans[100]={0};

void append(char a){
    int l=strlen(ans);
    ans[l]=a;
    ans[l+1]=0;
}



void solu(char *s){
    if(strlen(s)==0)
        return;
    if(strlen(s)==1)
    {
        append(s[0]);
        return;
    }
    int l=strlen(s);
    char max=-1;
    int index=-1;
    int i;
    for(i=0;i<l;i++){
        if(max<s[i]){
            max=s[i];
            index=i;
        }
    }
    append(max);
    solu(&s[index+1]);
}



int main()
{
    char s[1000]={0};
    scanf("%s",s);
    solu(s);
    printf("%s",ans);
    return 0;
}

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

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
char ans[100]={0};
  
void append(char a){
    int l=strlen(ans);
    ans[l]=a;
    ans[l+1]=0;
}
  
  
  
void solu(char *s){
    if(strlen(s)==0)
        return;
    if(strlen(s)==1)
    {
        append(s[0]);
        return;
    }
    int l=strlen(s);
    char max=-1;
    int index=-1;
    int i;
    for(i=0;i<l;i++){
        if(max<s[i]){
            max=s[i];
            index=i;
        }
    }
    append(max);
    solu(&s[index+1]);
}
  
  
  
int main()
{
    char s[1000]={0};
    scanf("%s",s);
    solu(s);
    printf("%s",ans);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2020-11-14

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

int MaxSubSequence(char* s, char* res){
    int len = strlen(s);
    if(len == 0){
        res[0] = '\0';
        return 0;
    }
    char max = 0x00;
    int index = -1;
    for(int i = 0; i < len; i++){
        if((int)s[i] > (int)max){
            max = s[i];
            index = i;
        }
    }
    res[0] = max;
    return 1+MaxSubSequence((char*)(s+index+1), (char*)(res+1));
}

int main(){
    char* str = (char*)malloc(51*sizeof(char));
    while(scanf("%s",str) != EOF){
        char* res = (char*)malloc(51*sizeof(char));
        MaxSubSequence(str, res);
        printf("%s\n",res);
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-08-14

#include<stdio.h>
#include<string.h>
#include<limits.h>
//
int main()
{
 char s[100];
  char c;
 
 while( scanf("%s",&s)!=EOF)
 {
   char str[100];
   int len=strlen(s);
   int i=0,m,maxc,k=0,t;
  //跟我的有点像,但是我的是死循环,跳不出来了,
 //本来自己写的while循环
   while(i<len)
   {
  //每次最大值的比较都要重新开始
    maxc=INT_MIN;
    for(int j=i;s[j]!='\0';j++)
    {
     if(s[j]-'a'>maxc)
     {
       maxc=s[j]-'a';
       c=s[j];
       m=j;
     }
    }
     str[k++]=c;
   // printf("%c",c);
     i=m+1;

  }
   for(t=0;t<k;t++)
       printf("%c",str[t]);
  printf("\n");
 }
    return 0;
}

上一题