找到所有好字符串

Posted 929code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找到所有好字符串相关的知识,希望对你有一定的参考价值。

给你两个长度为 n 的字符串 s1 和 s2 ,以及一个字符串 evil 。请你返回 好字符串 的数目。
好字符串 的定义为:它的长度为 n ,字典序大于等于 s1 ,字典序小于等于 s2 ,且不包含 evil 为子字符串

一. 数位dp + KMP算法

const int MOD = 1e9 + 7;

class Solution 
public:
    int findGoodStrings(int n, string s1, string s2, string evil) 
        //遍历下标,在s1[i]和s2[i]之间枚举字符
        //不受限的情况下,可以取26个字母
        //后面能否枚举,受前面的制约,想某种方法将前面的特征存下,用作dp数组的第二维,这里用前面已匹配的字符位数
        int len = evil.size(); int memo[n][len];
        memset(memo,-1,sizeof(memo));
        //获取next数组
        vector<int> fail(len, -1);//初始无前一元素,跳转-1,同时表示无相等元素,因为后面还要增
        for (int i = 1; i < len; i++)//从1开始,评估每个位置应跳转的地方
            int j = fail[i - 1];//前一元素的跳转位置
            while (j != -1 && evil[j + 1] != evil[i]) //跳转后的后一元素继续比较当前元素
                j = fail[j];//,匹配失效,继续跳转,压缩转移位置
            if (evil[i] == evil[j + 1])   fail[i] = j + 1;//相等记录该位置
            //否则跳转到-1
        

        function<int(int, int ,bool, bool)> f = [&](int i,int j,bool downlimit,bool uplimit) -> int //视情况记录已遍历值的某种特征,如1的个数,mask状态,
            if (j == len) return 0; //已枚举字符串包含evil,不合法,返回0
            if (i == n ) return 1;//边界条件,枚举出了一个满足条件的字符串
            if (!downlimit&&!uplimit&&memo[i][j]!= -1) //不受限且已经存储过,直接剪枝返回
                return memo[i][j];
            int res = 0; //计算个数
            char down = downlimit? s1[i]: \'a\';// 根据受限与否决定枚举数下界
            char up = uplimit? s2[i] : \'z\'; // 根据受限与否决定枚举数上界
            //做选择,因为每次移动要重新判断之前的字符串匹配到了哪一位,这里使用kmp算法,计算匹配失效转移位
            for (char c = down; c <= up; c++)
                int nextj = j-1;
                //对于枚举的字符,当前位不匹配,进行转移
                while(nextj!=-1&&evil[nextj+1]!=c) nextj = fail[nextj];
                //出循环再判断一次,因为nextj为-1后不会再判断移动
                if(evil[nextj+1]==c) nextj = nextj+1;
                res += f(i + 1, nextj + 1, downlimit&&c==down,uplimit&&c==up);//移动到下一位,判断限制情况
                res = res % MOD;//取模
            

            if (!downlimit&&!uplimit) //记录非限制数
                memo[i][j] = res;
            return res;
        ;
        return f(0,0,true,true);   //从下标0开始,刚开始受限
    
;

python大法好——编码.文件

1.编码

python3 中使用utf-8作为默认编码。

UTF-8对Unicode进行转化,为解决存储和网络传输问题。

UTF是为Unicode编码设计的一种在存储和传输节省空间的编码方案。

Unicode是万国码且世界所有电脑都基本支持。

python3执行代码过程:

1.解释器找到代码文件,把代码字符串文件头定义的编码加载到内存,系统转成Unicode编码。

2.把代码字符串按照流程语法规则进行解析。

3.所有变量字符串都以Unicode编码声明。

.decode("")用什么编码解码

.encode("")用什么编码编码

总结:

python3:文件默认编码UTF-8    字符串编码(加载到内存)unicode

 python2:文件默认编码ASCII     字符串编码默认是ASCII

                        你用什么编码  字符串加载到内存就是什么编码

                                                                                                                                        

bytes类型

python2中:

查看这个类型是字符串类型

提问:为什么bytes和str都是字符串类型为什么不全用字符串?

计算机中图片、视频不可以用字符串,底层都是用进制表示,用字符串会乱码,所以用bytes。

                                                                                                                                        

出现乱码问题会在哪些方面?

Apython中默认编码

B.python源文件编码

C.终端使用的编码

D.操作系统的语言设置

 

 

 

2.文件操作

对于文件的操作在python中占有相当大的分量,今天我们就从新人的角度来看看python中一些简单的文件操作。python中文件操作一共有六种常用模式,分别是‘r’,‘w’,‘a’,‘r+’,‘w+’,‘a+’。

1.读取文件

fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)

2.写文件

fo = open("foo.txt", "w")
fo.write( "Python is a great language.
Yeah its great!!
")

注意:写文件会把原来的文件内容清空掉重写。

3.读写 r+

fo = open("foo.txt", "r+")
print(fo.read())
fo.write( "Python is a great language.
Yeah its great!!
")
print(fo.read())

读写操作只能读原来写过的

4.写读w+

fo = open("foo.txt", "w+")
print(fo.read())
fo.write( "Python is a great language.
Yeah its great!!
")
print(fo.read())

两个都读不出来且文件会把原来写的都清空了再写。

 

以上是关于找到所有好字符串的主要内容,如果未能解决你的问题,请参考以下文章

python大法好——编码.文件

搜索整个DB2 DB

#1014 : Trie树

未能创建配置文件没有找到好的解决方案

438. 找到字符串中所有字母异位词

《LeetCode之每日一题》:221.找到字符串中所有字母异位词