思路:1、找出文本中所有Alice出现的位置,list1记录A的下标,2、找出文本中所有Bob出现的位置,list2记录B的下标. 3、遍历list1找出所有符合条件的Bob的个数. 4、同3再去找Bob之前的符合的Alice个数

  1. import java.util.ArrayList;
  2. import java.util.Scanner;
  3. public class Main
  4. {
  5. public static void main(String[] args)
  6. {
  7. Scanner scan=new Scanner(System.in);
  8. int K=scan.nextInt();
  9. scan.nextLine();
  10. String str=scan.nextLine();
  11. //保存A B在字符串中出现的位置
  12. ArrayList<Integer> list1=new ArrayList<>();
  13. ArrayList<Integer> list2=new ArrayList<>();
  14. //统计Alice出现的位置 记录的是A的位置
  15. for(int i=0;i+5<=str.length();i++)
  16. {
  17. //判断名字前后不能存在字母
  18. if((i==0||!check(str.charAt(i-1)))&&(i+5==str.length()||!check(str.charAt(i+5))))
  19. {
  20. if(str.substring(i, i+5).equals("Alice"))
  21. list1.add(i);
  22. }
  23. }
  24. //统计Bob出现的位置 记录的是B的位置
  25. for(int i=0;i+3<=str.length();i++)
  26. {
  27. //
  28. if((i==0||!check(str.charAt(i-1)))&&(i+3==str.length()||!check(str.charAt(i+3))))
  29. {
  30. if(str.substring(i,i+ 3).equals("Bob"))
  31. list2.add(i);
  32. }
  33. }
  34. // for(int i=0;i<list1.size();i++)
  35. // System.out.print(list1.get(i)+" ");
  36. // System.out.println();
  37. // for(int i=0;i<list2.size();i++)
  38. // System.out.print(list2.get(i)+" ");
  39. long ans=0;
  40. //遍历,找出符合条件的Bob的个数
  41. for(int i=0,l=0,r=-1;i<list1.size();i++)
  42. {
  43. while((r+1<list2.size())&&(list1.get(i)>=list2.get(r+1)))
  44. {
  45. r++;
  46. }
  47. while((l<=r)&&list1.get(i)-list2.get(l)-2>K)
  48. {
  49. l++;
  50. }
  51. ans+=r-l+1;
  52. }
  53. //去找Bob前符合的Alice的数量
  54. for(int i=0,l=0,r=-1;i<list2.size();i++)
  55. {
  56. while(r+1<list1.size()&&list2.get(i)>=list1.get(r+1))
  57. {
  58. r++;
  59. }
  60. while((l<=r)&&list2.get(i)-list1.get(l)-4>K)
  61. {
  62. l++;
  63. }
  64. if(l!=-1&&r!=-1)
  65. ans+=r-l+1;
  66. }
  67. System.out.println(ans);
  68. scan.close();
  69. }
  70. private static boolean check(char ch)
  71. {
  72. return (ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z');
  73. }
  74. }
点赞(0)
 

8.5 分

6 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

夏默 4年前 回复TA
@可乐学算法 同意,我的代码运行比他的快还超时。。。说真的
可乐学算法 4年前 回复TA
感觉是测试数据不够强 你这应该会t 因为你的复杂度是O(n^2)