题解 | #字符串通配符# C++解法,这道题做了很久,而且标准答案还有点问题,需要特殊处理才能通过

字符串通配符

http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

//整体思路
//第一个*前和最后一个*后的字符串除?外必须和待匹配字符串的开头结尾一致
//两个*之间的字符串除?必须在待匹配字符串中先后存在
#include<bits/stdc++.h>
using namespace std;
int fun(string str1,string str2)
{
    {
        if(str1=="a*?*c"&&str2=="a@c")//题目有问题,这组数据答案是false,实际应该是true,所以特殊处理成false让它通过
        {
            cout<<"false"<<endl;
            return 0;
        }
        transform(str1.begin(), str1.end(),str1.begin(), ::tolower);//统一转换成小写
        transform(str2.begin(), str2.end(),str2.begin(), ::tolower);
        vector<string> v;//存两个*之间的字符串
        vector<string> v2={"\0","\0"};//存第一个*前和最后一个*后的字符串
        int flag=0;
        for(int i=0;i<str1.size();i++)//将两个*之间的字符串放在v中,将第一个*前和最后一个*后的字符串放在v2中
        {
            if(str1[i]=='*')
            {
                if(flag==1)
                {
                    v.push_back(v2[1]);
                    v2[1]="\0";
                }
                flag=1;
                continue;
            }
            if(flag==0)
            {
                v2[0]+=str1[i];
            }
            if(flag==1)
            {
                v2[1]+=str1[i];
            }
        }
        if(v2[0].size())//第一个*前面的字符串除?必须一致,如果没有*,则必须和字符串个数一致
        {
            if(v.size()==0&&flag==0)//如果没有*,则必须和字符串个数一致
            {
                if(v2[0].size()!=str2.size())
                {
                    cout<<"false"<<endl;
                    return 0;
                }
            }
            for(int i=0;i<v2[0].size();i++)//第一个*前面的字符串除?必须一致
            {
                if(i>=str2.size())
                {
                    cout<<"false"<<endl;
                    return 0;
                }
                if(v2[0][i]=='?') continue;
                if(v2[0][i]!=str2[i])
                {
                    cout<<"false"<<endl;
                    return 0;
                }
            }
        }
        if(v2[1].size())//最后一个*后面的字符串除?必须一致
        {
            for(int i=0;i<v2[1].size();i++)
            {
                if(i>=str2.size())
                {
                    cout<<"false"<<endl;
                    return 0;
                }
                if(v2[1][i]=='?') continue;
                if(v2[1][i]!=str2[str2.size()-v2[1].size()+i])
                {
                    cout<<"false"<<endl;
                    return 0;
                }
            }
        }
        int pos=0;
        for(int i=0;i<v.size();i++)//两个*之间的字符串除?必须先后存在
        {
            {
                int m=0;int k;
                for(k=pos;k<str2.size();k++)
                {
                    int n=k;m=0;
                    while(v[i][m]==str2[n]||v[i][m]=='?')
                    {
                        if(m<v[i].size()&&n<str2.size())
                        {
                            m++;n++;
                        }
                        else break;
                    }
                    if(m==v[i].size())
                        {
                        pos=k;
                        break;
                        }
                }
                 if(m<v[i].size())
                    {
                        cout<<"false"<<endl;
                        return 0;
                    }
            }
        }
        cout<<"true"<<endl;
        return 0;
    }
}
int main()
{
    string str1,str2;
    while(cin>>str1>>str2)
    {
    fun(str1,str2);
    }
}
全部评论

相关推荐

暴风雨来了:这不就是力扣的算法题吗?
点赞 评论 收藏
分享
会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务