蓝桥杯 本质上升序列--JAVA

 题目:

小蓝特别喜欢单调递增的事物。 在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺
序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。 例如,在字符串 lanqiao 中,如果取出字符 n 和 q,则 nq
组成一个单 调递增子序列。类似的单调递增子序列还有 lnq、 i、 ano 等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第 二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到 ao。小蓝
认为他们并没有本质不同。 对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个? 例如,对于字符串
lanqiao,本质不同的递增子序列有 21 个。它们分别 是 l、 a、 n、 q、 i、 o、 ln、 an、 lq、 aq、 nq、
ai、 lo、 ao、 no、 io、 lnq、anq、 lno、 ano、 aio。 请问对于以下字符串(共 200
个小写英文字母,分四行显示):(如果你把 以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在 试题目录下有一个文件
inc.txt,内容与下面的文本相同)
本质不同的递增子序列有多少个?

tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
 

思路:

拿到题目一看是字母比较大小,直接想到遍历字符串比较就行

1:先创建一个数组a[]=new int [字符串的具体长度],它的数值是统计以每一个字符结尾的子字符串的个数的,比如“12”,a[0]的值代表以1结尾的子字符串=1,a[1]以2结尾有 “2”,“12”,所以a[1]=2;

2:因为每个字符都是字符串的子序列,可以令a[i]=1;

3:不难理解,a[i]的值又全体a[j]共同决定(0<j<i)

比如说有一个字符串有数字构成(和字符一样):127837;

a[i]a[i]的值对应元素
a[0]11
a[1]22  12
a[2]847  17  27  127
a[3]88 18 28 78 128 178 278 1278
a[4]43  13 23 123 
a[5]47 17 27 127 137 237 1237 37

按照a的定义 7 17 27 127属于a[5],因为他们的结尾都是7且都是上升序列,但是累加时这四个和a[2]对应的序列集重复 因此需要在a[5]-a[2]

代码:

String s="tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl";
	
		int a[]=new int[200];
		int count=0;
		for(int i=0;i<200;i++) {
			a[i]=1;
		}
		for(int i=1;i<200;i++) {
			for(int j=0;j<i;j++) {
				if(s.charAt(i)>s.charAt(j)) {
					a[i]+=a[j];
				}
				else if(s.charAt(i)==s.charAt(j)) {
					a[i]-=a[j];
				}
			}
		}
		for(int i=0;i<200;i++) {
			count+=a[i];
		}
		System.out.println(count);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值