字符串:字符串顺序比较、11-2删除重复元素、字符串生成器、着急的WYF(不同子串个数)

88 篇文章 1 订阅
4 篇文章 0 订阅

字符串顺序比较

问题描述

  比较两个字符串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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上Claire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值