找到所有好字符串
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())
两个都读不出来且文件会把原来写的都清空了再写。
以上是关于找到所有好字符串的主要内容,如果未能解决你的问题,请参考以下文章