s1

最大公共连续子序列

社会主义新天地 提交于 2019-11-28 03:55:48
经典:题给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。 第一反应一定是动态规划,那么需要注意以下几点: 1. 如果其中一个为空串或者都为空串,结果为0 if(len1==0 || len2==0) return 0; 2. 输入中可能包含空格,空格也将作为一个字符进行比较 我经常用经典的输入输出流,cin遇到回车和空格均当作字符串的结束,因此,处理方式如下: //包含头文件 #include <string.h> #include <cstdio> //将字符串定义为char数组 char s1[50],s2[50]; //输入时,采用cin.getline(str,maxinum) cin.getline(s1,50); cin.getline(s2,50); 3. 申请二维数组是,第一,采用vector容器实现,第二,采用动态申请空间实现,我用的第二种 int len1=strlen(s1); int len2=strlen(s2); int max=-1; if(len1==0 || len2==0) return 0; int **a = new int *[len1+1]; //先动态申请行 int i,j; for(i=0;i<=len1; ++i) { a[i] = new int [len2+1]; //在动态申请列;p[i]的类型是int

python基本数据类型方法回顾(集合)

ε祈祈猫儿з 提交于 2019-11-27 21:02:44
set()集合是一种无序、value不重复的类型,它本身是可变长度。 1.set.add() 说明:添加元素,如果添加元素包含在集合中,则不会添加上去。 例: s = {"1",2,'3',4,'6'} s.add(7) s.add("1") print(s) # 结果:{2, 4, '3', 7, '1', '6'} 2.set.remove() 说明:删除元素 例: s = {"1",2,'3',4,'6'} s.remove("1") print(s) #结果:{2, '6', 4, '3'} 3.set.intersection() 说明:取2个集合的交集,并返回生成新的集合。 例: s = {"1",2,'3',4,'6'} s1 = {'1',11,'3',4,22} c = s.intersection(s1) print(c) #结果:{'1', 4, '3'} 4.set.union() 说明:取2个集合的并集,并返回生成新的集合。 s = {"1",2,'3',4,'6'} s1 = {'1',11,'3',4,22} c = s.union(s1) print(c) #结果 {2, 4, '3', 11, '6', 22, '1'} 5.set.update() 说明:批量更新集合,如果需更新的属性已在集合内,不再添加,只添加不在集合中的。 s = {"1"

闭包函数的理解

守給你的承諾、 提交于 2019-11-27 18:34:38
function fn() { return function () { //s; console.log("hello") return function () { //s1 console.log("world") } } } var s=fn() console.log(s); var s1=s() console.log(s1) s1(); 第一步:将fn赋值给s,console.log(s)输出的是返回值。第二步:因为返回值是个函数s,将s()赋值给是s1,var s1=s(),相当于运行了s(),输出hello,且将s赋值给了s1,console.log(s1)输出的是一个返回函数s1;第三步:s1();执行了s1,输出hello 来源: https://www.cnblogs.com/hy96/p/11372429.html

Codeforces Round #579 (Div. 3)D2Remove the Substring (hard version)

我怕爱的太早我们不能终老 提交于 2019-11-27 07:37:36
Codeforces Round #579 (Div. 3)D2Remove the Substring (hard version) http://codeforces.com/contest/1203/problem/D2 题目大意 :给出一段长串s1和它的一段非连续子串s2,求s1最长的连续删除区间,使得s2仍为s1的非连续子串 分析:最大分割情况只可能是两种,一种是最左端或者最右端删去一大段,另一种是中间任意两个字母间删去一大段 先看第一种,那么肯定是要找到s2在s1中的最左相同点和最右相同点,很简单 另一种,删去的区间端点两个字母肯定是s2中相邻的字母,即保证删去中间一段没用的,仍是子串 例如s1:abbccbbbcccddde s2: ab 那么最长区间肯定是找到s1最左端满足条件的a,再找到s1最右端满足条件的b,中间都是可以删的,如果s2:abd 就找到s1最左端满足条件的b,再找到s1最右端满足条件的d,作差值,然后取max 以此类推 /** * Author1: low-equipped w_udixixi * Author2: Sherؼlock * Date :2019-08-13 **/ # include <cstdio> # include <cstring> # include <algorithm> # include <iostream> #

Shuffle'm Up POJ - 3087

流过昼夜 提交于 2019-11-27 05:50:49
现有字符串s1、s2、s12,其中s1、s2的长度为len,s12的长度为2*len。 是否可以通过一些操作使s1和s2转换合并成s12? 变换的操作规则如下: 假设s1=11111,s2=00000 变换后的序列 s=0101010101 假设s1=12345,s2=67890 变换后的序列 s=6172839405 如果s和s12完全相同,那么输出变换次数 如果不完全相等,s的前半部分作为s1,后半部分作为s2,重复上述过程。 Input: 第一行T(1≤T≤1000),代表有T组数据. 每组数据第一行len(1≤len≤100),第二行长度为len的字符串s1,第三行长度为len的字符串s2,第四行长度为2*len的字符串s12。 Output: 首先输出处理数据组的编号(编号从1开始) 再输出变换次数并换行。 注意两个数字之间有空格。 对于变换次数,如果无需变换直接得到s12,那么输出0,如果无论怎么变换都不会得到s12,那么输出 -1。 Sample Input: 2 4 AHAH HAHA HHAAAAHH 3 CDE CDE EEDDCC Sample Output: 1 2 2 -1 Hint 题意感悟:模拟是代码能力的体现,考察了map #include <iostream> #include <cstdio> #include <algorithm>

coderforce 545B. Equidistant String

天大地大妈咪最大 提交于 2019-11-27 03:33:01
题意: 求一个字符串,使得他与S,T,相似度相差相等 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm=1e5+10; char s1[maxm]; char s2[maxm]; char s3[maxm]; int main() { while(scanf("%s%s",s1,s2)!=EOF) { int len=strlen(s1); int cnt=0; int sum=0; for(int i=0;i<len;i++) { if(s1[i]!=s2[i]) { cnt++; } } if(cnt%2!=0) { printf("impossible\n"); } else { cnt/=2; for(int i=0;i<len;i++) { if(s1[i]!=s2[i]&&sum<cnt) { s3[i]=s1[i]; sum++; } else { s3[i]=s2[i]; } } } printf("%s\n",s3); } return 0; } 来源: CSDN 作者: 南宫嘉俊 链接: https://blog.csdn.net/zyx520ytt/article/details/49908905

【模板】KMP算法

白昼怎懂夜的黑 提交于 2019-11-27 01:32:35
用途:处理字符串匹配问题 例子:给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置 时间复杂度:O(n) 变量解释: A[i]:存储A串 B[i]:存储B串 p[i]:在B串中与字母B[i]相同的上一个字母的位置 给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置 预处理p[]: void pre() { p[1]=0; int j=0; for (int i=1;i<m;i++) { while (j>0&&B[j+1]!=B[i+1]) j=p[j]; if (B[j+1]==B[i+1]) j++; p[i+1]=j; } } KMP: int kmp() { int j=0; for (int i=0;i<n;i++) { while (j>0&&B[j+1]!=A[i+1]) j=p[j]; if (B[j+1]==A[i+1]) j++; if (j==m) { printf("%d\n",i+1-m+1); j=p[j]; } } } 来源: https://blog.csdn.net/weixin_45485187/article/details/99233348

short s1 = 1; s1 = s1 + 1; 有什么错?short s1 = 1; s1 += 1; 为什么对?

Deadly 提交于 2019-11-27 01:17:52
下面先看代码: public static void main(String[] args) { Short i = 1; i = i + 1; System.out.println(i); }   是因为i+1运算时会自动提升表达式的类型,因为 i 是 short 类型,1是 int 类型的,所以 i 自动提升为 int 类型的,运算过后再赋值给 short 为型的 i ,编译器这个时候会报告强制转换类型错误。 public static void main(String[] args) { short i = 1; i += 1; System.out.println(i); } 对于short s1= 1; s1 += 1; 因为 += 是java语言的内置的运算符,是一种特殊的运算,不会有编译错误,不会出错。 细节决定成败! 来源: https://www.cnblogs.com/xdtg/p/11337520.html

最长公共子序列c++实现

走远了吗. 提交于 2019-11-27 00:23:33
最长公共子序列 给定两个字符串S1和S2,求两个字符串的最长公共子序列的长度。 输入样例 ABCD AEBD 输出样例 3 解释 S1和S2的最长公共子序列为ABD,长度为3 思路 动态规划 L C S ( m , n ) LCS(m ,n) L C S ( m , n ) 表示 S 1 [ 0... m ] S1[0...m] S 1 [ 0 . . . m ] 和 S 2 [ 0... n ] S2[0...n] S 2 [ 0 . . . n ] 的最长公共子序列的长度 S 1 [ m ] = = S 2 [ n ] : L C S ( m , n ) = 1 + L C S ( m − 1 , n − 1 ) S1[m] == S2[n]: LCS(m, n) = 1 + LCS(m - 1, n - 1) S 1 [ m ] = = S 2 [ n ] : L C S ( m , n ) = 1 + L C S ( m − 1 , n − 1 ) S 1 [ m ] ! = S 2 [ n ] : L C S ( m , n ) = m a x ( L C S ( m − 1 , n ) , L C S ( m , n − 1 ) ) S1[m] != S2[n]: LCS(m, n) = max(LCS(m - 1, n), LCS(m, n - 1)) S 1 [ m

KMP

烂漫一生 提交于 2019-11-26 22:34:22
掌握重点就完全O得K。码量感人 思路: 见 030 ,讲得精炼易懂,比某博客“从头到尾彻底理解”的12048字好多了(纯粹发泄一下怨念)。注意重点理解next数组定义,与i,j的初始值即可。哦对了,其实看六个小时KMP还没看懂和看三个小时的快排感受是一样的:) 哦不我又开始吐槽了。 好吧好吧直接贴模板题和代码。 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。 为了减少骗分的情况,接下来还要输出子串的前缀数组next。如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。 输入输出样例 输入样例#1: 输出样例#1: 说明 时空限制:1000ms,128M 数据规模: 设s1长度为N,s2长度为M 对于30%的数据:N<=15,M<=5 对于70%的数据:N<=10000,M<=100 对于100%的数据:N<=1000000,M<=1000 代码 #include<cstdio> #include<iostream> #include<cstring>