字符串——522. 最长特殊序列 II

难度:中等

题目

给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。

子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。

输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。

 

示例:

输入: "aba", "cdc", "eae"
输出: 3
 

提示:

所有给定的字符串长度不会超过 10 。
给定字符串列表的长度将在 [2, 50 ] 之间。

解答

思路

一个字符串如果是其他字符串的子序列,则其子序列必定也是其他字符串的子序列;一个字符串的子序列是特殊序列,则其母序列,也是特殊序列,且长度比前者长。所以只要比较每个字符串是不是特殊序列就好了。
比较过程:就是两个指针,指针1指向字符1,指针2指向字符2。指针1先固定,指针2从左到右遍历,如果指针2所指的字符和指针1一样,则指针1右移一格,如果指针1移到最右边,则说明字符1不是特殊序列。

知识点

vector的assign两种赋值
复杂度O
时间复杂度O(x*n2)
空间复杂度O(1)

代码

class Solution {
public:
    int findLUSlength(vector<string>& strs) {
        int i,j;
        int max_length=0;
        bool is_special=false;
        for(i=0;i<strs.size();i++){
            is_special=true;
            for(j=0;j<strs.size();j++){
                if(i==j){
                    continue;
                }
                if(!checkIsSpecial(strs[i],strs[j])){
                    is_special=false;
                    break;
                }
            }
            if(is_special){
                if(strs[i].size()>max_length){
                    max_length=strs[i].size();
                }
            }
        }
        return max_length==0?-1:max_length;
    }
    
    bool checkIsSpecial(string str1,string str2){
        if(str1.size()>str2.size()){
            return true;
        }
        if(str1.size()==str2.size()){
            if(str1==str2){
                return false;
            }
            else{
                return true;
            }
        }
        int add=0;
        for(int i=0;add<str1.size()&&i<str2.size();i++){
            if(str2[i]==str1[add]){
                add++;
            }
        }
        if(add>=str1.size()){
            return false;
        }
        else{
            return true;
        }
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值