字符串顺序比较
问题描述
比较两个字符串s1和s2,输出:0表示s1与s2相等;1表示s1的字母序先于s2;-1表示s1的字母序后于s2
输入格式
输入两行,第一行输入一个字符串1,第二行输入字符串2。
输出格式
输出比较的结果
样例输入
abc
abd
样例输出
1
样例输入
English
English
样例输出
0
样例输入
hello
ha
样例输出
-1
package 字符串;
import java.util.Scanner;
public class 字符串顺序比较 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s1=sc.next().trim();
String s2=sc.next().trim();
int n=s2.compareTo(s1);
if(n==0)
n=0;
else if(n>0)
n=1;
else
n=-1;
System.out.println(n);
}
}
字符串生成器
问题描述
有一个字符串生成器,初始时生成的字符串为空串,它每次按照给定概率随机生成一个小写字母,加在当前已生成字符串的后面。
给定N个长度为L的字符串,每个字符串由小写字母组成。
如果在某个时候,发现每个给定字符串都在当前已生成的字符串中作为子串出现过,生成器就会停下来,将当前生成的字符串作为输出。
求输出字符串长度的期望值。
输入格式
第一行包含一个正整数C,表示有C组数据。
每组数据的第一行包含三个正整数N, L, T (L<=6, T<=10)。其中T表示生成器仅会生成前T个小写字母。
每组数据的第2~N+1行,每行包含一个长度为L的字符串,每个字符串由前T个小写英文字母组成。
每组数据的第N+2行包含T个不超过10000的正整数,设第i个正整数为x,那么字符串生成器生成第i个小写字母的概率为x/10000。输入保证这T个正整数之和为10000。
输出格式
包含C行,依次对应每组数据。每行包含一个实数,表示输出字符串长度的期望值。
样例输入
1
2 3 3
aac
abb
3333 3333 3334
样例输出
40.5060771264
数据规模和约定
本题共10个测试点。
对于30%的数据,N=1, C=1;
对于60%的数据,N<=4, C<=2;
对于100%的数据,N<=8, C<=20。
其中N=1的数据中存在一个测试点,只有你的答案和我们的答案相差小于1才为正确,并且这个测试点中L=3, T=3;
对于其他9个测试点,只有你的答案和我们的答案相差小于0.01才为正确。
数据保证正确答案不会超过5*10^6。
11-2删除重复元素
问题描述
为库设计新函数DelPack,删除输入字符串中所有的重复元素。不连续的重复元素也要删除。
要求写成函数,函数内部使用指针操作。
样例输入
1223445667889
样例输出
13579
样例输入
else
样例输出
ls
数据规模和约定
字符串数组最大长度为100。
package 字符串;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 删除重复元素 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
char[] a=sc.next().toCharArray();
Map<Character,Integer> map=new HashMap<>();
for(int i=0;i<a.length;i++){
if(map.containsKey(a[i])==false)
map.put(a[i],0);
map.put(a[i],map.get(a[i]).intValue()+1);
}
for(int i=0;i<a.length;i++){
if(map.get(a[i])==1)
System.out.print(a[i]);
}
}
}
着急的WYF(不同子串个数)
问题描述
由于战网的密码是一串乱码,WYF巧妙地忘记了他的密码。(他就是作死,如同自掘坟墓。说到掘坟墓,问题就来了——挖掘机技术究竟哪家强?)他现在非常着急,走投无路,都快飞起来了。他只记得他的密码是某个字符串S的子串。现在问题来了,你要告诉他有多少种可能的密码,以帮助他确定他能在多少时间内完成枚举并尝试密码的工作。
输入格式
输入仅包含一行,为字符串S,不含空格。
输出格式
输出一个整数,表示可能的密码数量。
样例输入
ToTal
样例输出
14
数据规模和约定
对于70%的数据,S的长度不超过1000;(暴力)
对于100%的数据,S的长度不超过15000。(Suffix Array)
不同子串个数
给一个长为n的子串,求不同子串个数,经典题目。
以位置i,i∈[0,n)i,i\in[0,n)i,i∈[0,n)为起点,共有(n−i)(n-i)(n−i)个子串,这其中最多有height[rank[i]]height[rank[i]]height[rank[i]]个串与其它串重复。
结论:不同子串个数等于n∗(n+1)/2−ΣHeightn*(n+1)/2-\Sigma Heightn∗(n+1)/2−ΣHeight
————————————————
版权声明:本文为CSDN博主「Little_Fall」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37809890/article/details/98318970
后缀数组(suffix array)
构造Rank数组,对每个i一次计算其后缀的排名,如下第一个后缀排名第4,所以Rank数组第一个为4