枢覆引 发表于 2025-6-8 22:06:35

算法day08-字符串篇(2)

目录


[*]反转字符串中的单词
[*]找出字符串中第一个匹配项的下标
[*]重复的子字符串
一、反转字符串中的单词


   主要思路:把整个字符串的头尾的空格先去掉,然后根据” ”来划分字符串数组,将字符串倒着放进结果中。
class Solution {
    public String reverseWords(String s) {
      String[] parts = s.trim().split("\\s+");      //去掉首尾空格
      StringBuilder sb = new StringBuilder();
      for(int i = parts.length-1; i>=0; i--){
            if(i == 0){
                sb.append(parts);
            }else{
                sb.append(parts);
                sb.append(" ");
            }
      }
      return sb.toString();
    }
}
//时间复杂度:O(n)
//空间复杂度:O(n) 
二、右旋转字符串


 
class Main{
    public static void main(String[] args){
      Scanner in = new Scanner(System.in);
      int n = in.nextInt();
      in.nextLine();
      String s = in.nextLine();
      int p1 = s.length() - n;      //要右旋的起点
      int p2 = 0;
      StringBuilder sb = new StringBuilder();
      while(p1 < s.length()){
            sb.append(s.charAt(p1));
            p1++;
      }
      while(p2 < s.length() - n){
            sb.append(s.charAt(p2));
            p2++;
      }
      System.out.print(sb);
    }
}
//时间复杂度:O(N)
//空间复杂度:O(N) 
三、找出字符串中第一个匹配项的下标


   主要思路:在原字符串的每一个位置都截取一段子字符串来判断是否和needle相等。
class Solution {
    public int strStr(String haystack, String needle) {
      if(needle.length()==0){
            return 0;
      }
      if(needle.length() > haystack.length()){
            return -1;
      }
      for(int i=0; i<=haystack.length() - needle.length(); i++){
            if(haystack.substring(i, i+needle.length()).equals(needle)){
                return i;
            }
      }
      return -1;
    }
}
//时间复杂度:O((n-m+1)*m)
//空间复杂度:O(1)// 时间复杂度:O(n),其中 n 是字符串的长度,KMP 构造 next 数组只需要一次线性扫描。
// 空间复杂度:O(n),用于存储前缀表 next[]。
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 算法day08-字符串篇(2)