文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【LeetCode算法成长之路】Java字符串相关类总结与经典题目分析

2023-09-10 11:38

关注

在这里插入图片描述

本文小新为大家带来 Java字符串相关类总结与经典题目分析 相关知识,具体内容包括不可变字符序列String介绍(包括:String 的特性String 的构造器String 与其他结构间的转换String 的基本常用方法String 的查找方法String 的字符串截取方法String 的和字符/字符数组相关方法String 的开头与结尾判断方法String 的替换方法),可变字符序列StringBuffer与StringBuilder(包括:StringBuffer 与 StringBuilder 的理解StringBuilder、StringBuffer 的 API),字符串操作经典算法题目(包括:去除字符串两端的空格将字符串进行反转一个字符串在另一个字符串中出现的次数两个字符串中的最大相同子串对字符串中字符进行自然顺序排序)等进行详尽介绍~

不积跬步,无以至千里;不积小流,无以成江海。每天进步一点点,在成为强者的路上,小新与大家共同成长!

📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)


Java字符串相关类总结与经典题目分析

在这里插入图片描述

在LeetCode算法题目中有许多 关于字符串的题目,对于这些题目,如果我们需要熟练掌握Java中的字符串类,包括其中常用的方法,对于这类题目就可以游刃有余。

下面会先为大家对不可变字符序列String,及可变字符序列StringBuffer与StringBuilder进行介绍,并为大家总结有关的常用方法,最后为大家展示几道与字符串有关的经典算法题目。

1️⃣String 的特性

在这里插入图片描述

2️⃣String 的构造器

3️⃣String 与其他结构间的转换

🍀字符串 --> 基本数据类型、包装类

🍀基本数据类型、包装类 --> 字符串

🍀字符数组 --> 字符串

🍀字符串 --> 字符数组

🍀字符串 --> 字节数组(编码)

🍀字节数组 --> 字符串(解码)

4️⃣String 的基本常用方法

String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。

5️⃣String 的查找方法

6️⃣String 的字符串截取方法

7️⃣String 的和字符/字符数组相关方法

8️⃣String 的开头与结尾判断方法

9️⃣String 的替换方法

因为 String 对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也比较高。因此,JDK 又在java.lang包提供了可变字符序列 StringBuffer 和 StringBuilder 类型。

1️⃣StringBuffer 与 StringBuilder 的理解

//情况 1:String s = new String("我喜欢学习");//情况 2:StringBuffer buffer = new StringBuffer("我喜欢学习");buffer.append("数学");

在这里插入图片描述

2️⃣StringBuilder、StringBuffer 的 API

StringBuilder、StringBuffer 的 API 是完全一致的,并且很多方法与 String 相同。

🍀常用 API

🍀与 String相同的方法

1️⃣题目1:去除字符串两端的空格

模拟一个 trim 方法,去除字符串两端的空格。

public String myTrim(String str) {  if (str != null) {    int start = 0;// 用于记录从前往后首次索引位置不是空格的位置的索引    int end = str.length() - 1;// 用于记录从后往前首次索引位置不是空格的位置的索引    while (start < end && str.charAt(start) == ' ') {      start++;    }    while (start < end && str.charAt(end) == ' ') {      end--;    }    if (str.charAt(start) == ' ') {      return "";    }    return str.substring(start, end + 1);  }  return null;}@Testpublic void testMyTrim() {  String str = " a ";  // str = " ";  String newStr = myTrim(str);  System.out.println("---" + newStr + "---");}

2️⃣题目2:将字符串进行反转

将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”。

// 方式一:public String reverse1(String str, int start, int end) {// start:2,end:5  if (str != null) {  // 1.  char[] charArray = str.toCharArray();  // 2.  for (int i = start, j = end; i < j; i++, j--) {    char temp = charArray[i];    charArray[i] = charArray[j];    charArray[j] = temp;  }  // 3.  return new String(charArray);  }  return null;}// 方式二:public String reverse2(String str, int start, int end) {  // 1.  String newStr = str.substring(0, start);// ab  // 2.  for (int i = end; i >= start; i--) {    newStr += str.charAt(i);  } // abfedc  // 3.  newStr += str.substring(end + 1);  return newStr;}// 方式三:推荐 (相较于方式二做的改进)public String reverse3(String str, int start, int end) {// ArrayLi  st list = new ArrayList(80);  // 1.  StringBuffer s = new StringBuffer(str.length());  // 2.  s.append(str.substring(0, start));// ab  // 3.  for (int i = end; i >= start; i--) {    s.append(str.charAt(i));  }  // 4.  s.append(str.substring(end + 1));  // 5.  return s.toString();}@Testpublic void testReverse() {  String str = "abcdefg";  String str1 = reverse3(str, 2, 5);  System.out.println(str1);// abfedcg}

3️⃣题目3:一个字符串在另一个字符串中出现的次数

获取一个字符串在另一个字符串中出现的次数。 比如:获取“ ab”在“abkkcadkabkebfkabkskab” 中出现的次数。

// 判断 str2 在 str1 中出现的次数public int getCount(String mainStr, String subStr) {  if (mainStr.length() >= subStr.length()) {    int count = 0;    int index = 0;    // while((index = mainStr.indexOf(subStr)) != -1){    //   count++;    //   mainStr = mainStr.substring(index + subStr.length());    // }    // 改进:    while ((index = mainStr.indexOf(subStr, index)) != -1) {      index += subStr.length();      count++;    }    return count;  } else {    return 0;  }}@Testpublic void testGetCount() {  String str1 = "cdabkkcadkabkebfkabkskab";  String str2 = "ab";  int count = getCount(str1, str2);  System.out.println(count);}

4️⃣题目4:两个字符串中的最大相同子串

获取两个字符串中最大相同子串。比如: str1 = "abcwerthelloyuiodef“; str2 = “cvhellobnm” 提示:将短的那个串进行长度依次递减的子串与较长的串比较。

// 如果只存在一个最大长度的相同子串public String getMaxSameSubString(String str1, String str2) {  if (str1 != null && str2 != null) {    String maxStr = (str1.length() > str2.length()) ? str1 : str2;    String minStr = (str1.length() > str2.length()) ? str2 : str1;    int len = minStr.length();    for (int i = 0; i < len; i++) {// 0 1 2 3 4 此层循环决定要去几个字符      for (int x = 0, y = len - i; y <= len; x++, y++) {        if (maxStr.contains(minStr.substring(x, y))) {          return minStr.substring(x, y);        }      }    }  }  return null;}// 如果存在多个长度相同的最大相同子串// 此时先返回 String[],后面可以用集合中的 ArrayList 替换,较方便public String[] getMaxSameSubString1(String str1, String str2) {  if (str1 != null && str2 != null) {    StringBuffer sBuffer = new StringBuffer();    String maxString = (str1.length() > str2.length()) ? str1 : str2;    String minString = (str1.length() > str2.length()) ? str2 : str1;    int len = minString.length();    for (int i = 0; i < len; i++) {      for (int x = 0, y = len - i; y <= len; x++, y++) {        String subString = minString.substring(x, y);        if (maxString.contains(subString)) {          sBuffer.append(subString + ",");        }      }      System.out.println(sBuffer);      if (sBuffer.length() != 0) {        break;      }    }    String[] split = sBuffer.toString().replaceAll(",$", "").split("\\,");    return split;  }  return null;}// 如果存在多个长度相同的最大相同子串:使用 ArrayList// public List getMaxSameSubString1(String str1, String str2) {//   if (str1 != null && str2 != null) {//     List list = new ArrayList();//     String maxString = (str1.length() > str2.length()) ? str1 : str2;//     String minString = (str1.length() > str2.length()) ? str2 : str1;////     int len = minString.length();//     for (int i = 0; i < len; i++) {//       for (int x = 0, y = len - i; y <= len; x++, y++) {//         String subString = minString.substring(x, y);//         if (maxString.contains(subString)) {//           list.add(subString);//         }//       }//       if (list.size() != 0) {//         break;//       }//     }//     return list;//   }//   return null;// }@Testpublic void testGetMaxSameSubString() {  String str1 = "abcwerthelloyuiodef";  String str2 = "cvhellobnmiodef";  String[] strs = getMaxSameSubString1(str1, str2);  System.out.println(Arrays.toString(strs));}

5️⃣题目5:对字符串中字符进行自然顺序排序

对字符串中字符进行自然顺序排序。

提示:

@Testpublic void testSort() {  String str = "abcwerthelloyuiodef";  char[] arr = str.toCharArray();  Arrays.sort(arr);  String newStr = new String(arr);  System.out.println(newStr);}

在这里插入图片描述

👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~

来源地址:https://blog.csdn.net/qq_42146402/article/details/129902503

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯