前言 本文小新为大家带来 Java字符串相关类总结与经典题目分析 相关知识,具体内容包括不可变字符序列String介绍(包括:String 的特性,String 的构造器,String 与其他结构间
本文小新为大家带来 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微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)
在LeetCode算法题目中有许多 关于字符串的题目,对于这些题目,如果我们需要熟练掌握Java中的字符串类,包括其中常用的方法,对于这类题目就可以游刃有余。
下面会先为大家对不可变字符序列String,及可变字符序列StringBuffer与StringBuilder进行介绍,并为大家总结有关的常用方法,最后为大家展示几道与字符串有关的经典算法题目。
🍀字符串 --> 基本数据类型、包装类
🍀基本数据类型、包装类 --> 字符串
🍀字符数组 --> 字符串
🍀字符串 --> 字符数组
🍀字符串 --> 字节数组(编码)
🍀字节数组 --> 字符串(解码)
String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。
因为 String 对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也比较高。因此,jdk 又在java.lang包提供了可变字符序列 StringBuffer 和 StringBuilder 类型。
//情况 1:String s = new String("我喜欢学习");//情况 2:StringBuffer buffer = new StringBuffer("我喜欢学习");buffer.append("数学");
StringBuilder、StringBuffer 的 API 是完全一致的,并且很多方法与 String 相同。
🍀常用 API
🍀与 String相同的方法
模拟一个 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 + "---");}
将一个字符串进行反转。将字符串中指定部分进行反转。比如“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}
获取一个字符串在另一个字符串中出现的次数。 比如:获取“ 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);}
获取两个字符串中最大相同子串。比如: 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));}
对字符串中字符进行自然顺序排序。
提示:
@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
--结束END--
本文标题: 【LeetCode算法成长之路】Java字符串相关类总结与经典题目分析
本文链接: https://www.lsjlt.com/news/402235.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0