面试:字符串字典序最大的子序列

字符串字典序最大的子序列

  • 首先要知道什么是字典序,顾名思义,就是字典上的顺序。两个字符串进行对比时, 一位一位的按照a, b, c等字典序比较,如果相同就顺位比较下一位,比如ba比ab大,如果哪一位已经不一样 就已经比较出来结果了,如果是abc, abcd这样的情况,长度长的大。
  • 子序列和子串的区别;这俩其实不一样,子串是连续的,比如字符串abcdef,它的子串是abc,abcd等这些连续的。而子序列是不连续的。比如ace这样的。
  • 最简单的想法,先遍历一遍,找到最大的一个字符,以及他的位置,然后从这个位置开始往后遍历,找到后面最大的字符串以及位置,再继续下去,很明显,这样的算法复杂度比较高,N^2的复杂度。
  • 这里提供一个解决方案。用一个变量保存遍历到当前的最大值,从后往前遍历,如果字符比变量大,就更新最大值。记录字符。最后逆向输出字符就ok;附上代码
char str[100000 + 10];
char ans[100000 + 10];
int main()
{
    cin>>str;
    int maxnum = -1;
    int pos = -1;
    int lenstr = strlen(str);
    int ansflag = 0;
    for(int i = lenstr - 1; i >= 0; i--){
        if(str[i] - '0' >= maxnum){
            maxnum = str[i] - '0';

            ans[ansflag++] = str[i];
        }
    }
    for(int i = strlen(ans) - 1;i>=0;i--)
    cout<<ans[i];
    cout<<endl;
}

题目是有提交的地址,字典序最大的子序列

祝你成功~

原文地址:https://www.cnblogs.com/leon-ldy/p/12332841.html

时间: 2024-10-07 22:28:33

面试:字符串字典序最大的子序列的相关文章

C - 字典序最小的子序列 51nod1255

C - 字典序最小的子序列 Time Limit: 4000/2000 MS (Java/Others)      Memory Limit: 1280000/640000 KB (Java/Others) Submit Status Problem Description 给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件:1.包含字符串中所有出现过的字符各1个.2.是所有满足条件1的串中,字典序最小的.例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,

51nod 1255 字典序最小的子序列

1255 字典序最小的子序列 题目来源: 天津大学OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件: 1.包含字符串中所有出现过的字符各1个. 2.是所有满足条件1的串中,字典序最小的. 例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,字典序最小的为abdc. Input 输入1行字符串S,所有字符均为小写,字符串的长度为L.(1 <= L <=

字符串的回文子序列个数

题目描述 求一个长度不超过15的字符串的回文子序列个数(子序列长度>=1). 输入描述 输入一个长度不超过15的字符串,字符串均由小写字母表示 输出描述 输出其回文子序列个数 样例输入 abaa 样例输出 10 注释 本例中其所有回文子序列为: a,b,a,a,aba,aba,aa,aa,aa,aaa 一个字符串的子序列是指在原字符串上去除某些字符但不破坏余下元素的相对位置(在前或在后)而形成的新字符串. #include<iostream> #include<string>

实习生面试--算法题之字符串最长公共子序列长度

题目:求两字符串的最长公共子序列的长度. 题外话:最长公共子串,子序列问题是被充分讨论的问题,网上一搜一大把,请bing之. 本题只要求求最长公共子序列的长度,而不需要记录最长的公共子序列,给予了我们便利,请参考代码: 1 int max(int a, int b) 2 { 3 return a > b ? a : b; 4 } 5 6 int lcs(char* str1, char* str2) 7 { 8 if (str1 == nullptr || str2 == nullptr) 9

[算法总结] 13 道题搞定 BAT 面试——字符串

1. KMP 算法 谈到字符串问题,不得不提的就是 KMP 算法,它是用来解决字符串查找的问题,可以在一个字符串(S)中查找一个子串(W)出现的位置.KMP 算法把字符匹配的时间复杂度缩小到 O(m+n) ,而空间复杂度也只有O(m).因为"暴力搜索"的方法会反复回溯主串,导致效率低下,而KMP算法可以利用已经部分匹配这个有效信息,保持主串上的指针不回溯,通过修改子串的指针,让模式串尽量地移动到有效的位置. 具体算法细节请参考: 字符串匹配的KMP算法 从头到尾彻底理解KMP 如何更好

51Nod1255 字典序最小的子序列

Problem 给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件: 1.包含字符串中所有出现过的字符各1个. 2.是所有满足条件1的串中,字典序最小的. 例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,字典序最小的为abdc. Solution 一个栈,当前没有在栈内,栈顶不是最后一个,且当前更小,就出1个入1个. Code #include<iostream> #include<stdio.h> #include<algorith

字符串字典序

字典序遵循的是逐字符比较的方式,越靠左的字符越会被先比较; 逐字符比较过程中,一旦发现某一对被比较的字符之间不相等时,这一对字符的大小关系即为这一对字符串的大小关系; eg. "abc" < "abd" 逐字符比较过程中,一旦出现某一个字符串的所有字符都已经经过比较,而另一字符串还存在未被比较的字符时,较短的字符串更小. eg. "abc" < "abcde" 如果所有字符串内的字符都被发现相等,则这两个字符串相等

51Nod 1092 回文字符串 | 最长公共子序列变形

求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #define maxn 1005 char s[maxn],s1[maxn]; int dp[maxn][maxn]; int main() { int n=0,i,j,len; scanf("%s",s); len=strlen(s); strcpy(s1,s); strrev(s1); f

字符串最长公共子序列问题

找两个字符串的最长公共子序列,最长公共子序列并不要求连续. 代码如下: package string; import java.util.ArrayList; import java.util.List; /** * 字符串的最长公共子序列问题 * @author Administrator * */ public class LCSequence { /** * 求最长公共子序列长度 * @param s1 * @param s2 * @return */ public int getMaxL