题目链接:?1315: 杜学霸和谭女神
Description
大家都知道俱乐部的杜学霸和谭女神的成绩都特别好,他们想帮助俱乐部的其他人通过考试。考试的题目需要解决如下的这个IT问题。
现有一串字符 string = s1s2s3…sn(n是这个字符串的长度),字符串只包含".“和”#"。接下来有m个问题。每一个问题都有两个整数li,ri。需要求出在区间中有多少个p(li<=p<ri),满足 s[p]=s[p+1]。
请帮助杜学霸和谭女神解决这个问题。
Input
第一行包含一串长度为n的字符(2<=n<=10^5)。保证字符串只包含".“和”#"。
接下来一行为一个整数m(1<=m<=10^5)—问题的数量。接下来的m行每一行有两个整数li,ri(1<=li<=ri<=n)
Output
输出m个数字,对应输入的每一个问题的答案。
Sample Input
......
4
3 4
2 3
1 6
2 6
#..###
5
1 3
5 6
1 5
3 6
3 4
Sample Output
1
1
5
4
1
1
2
2
0
分析?
用一个byte
型数组来表示字符串的邻位是否相同,然后累和即可。
特别容易超时。
代码?
/**
* Time 2633ms
* @author wowpH
* @version 1.1
* @date 2019年6月19日下午8:19:55
* Environment: Windows 10
* IDE Version: Eclipse 2019-3
* JDK Version: JDK1.8.0_112
*/
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(new InputStreamReader(System.in));
String string;
int questionNumber, left, right, count, length;
byte[] ans;
while (sc.hasNext()) {
string = sc.next();
length = string.length();// 字符串长度
ans = new byte[length + 1];// 下标从1开始
for (int i = 1; i < length; ++i) {
if (string.charAt(i) == string.charAt(i - 1)) {
ans[i] = 1;// 转换为数字
}
}
questionNumber = sc.nextInt();// 问题数
while ((questionNumber--) > 0) {
left = sc.nextInt();
right = sc.nextInt();
count = 0;// 计数
for (int i = left; i < right; ++i) {
count += ans[i];
}
System.out.println(count);// 输出
}
}
sc.close();
}
}
版权声明
- 转载、参考、引用必须在首页添加如下文字:
[WUSTOJ 1315: 杜学霸和谭女神(Java)——wowpH](https://blog.csdn.net/pfdvnah/article/details/92847640)
- 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
- 如果有疑问欢迎评论区留言,尽量解答;
- 如果有错误,还望大侠评论区指正。