1.最为典型的求最长公共前缀
1.1
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:""
解释:输入不存在公共前缀
首先我们在比较几个字符时,会先想到用第一个字符来遍历其他字符,以来比较,而在这题字符串的比较中,我们也可以考虑这种情况,用第一个字符串与其他字符串进行比较,首先我们得到的是一个字符串数组
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0)//曾经因为没有考虑长度为0的情况而一直错误
{
return "";
}
String arr = strs[0];//得到第一个字符串用来便利其他字符串
for(int i = 1;i < strs.length;i++)
{
int j = 0;
for(;j < arr.length() && j < strs[i].length();j++)//确保不能出现越界的情况
{
if(arr.charAt(j) != strs[i].charAt(j))
{
break;
}
}
arr = arr.substring(0,j);//这里我们将得到从0开始到j-1的最长公共前缀
if(arr.equals(""))
return "";
}
return arr;
}
}
1.2
除了这一种题目外,更难的是两个字符串里面找出他们最长的相同的字符串
(这里我们只考虑只出现一次最长相同字符串的情况)
题目:
String str1 = "qwertyuhelloop" String str2 = "zxchellods"
求出这两个字符串最长的字符串
这里我们使用的方法有(contains,substring)
public String getMain(String str1,String str2)
{
if(str1 != null && str2 != null)
{
String maxString = (str1.length() >= str2.length())?str1:str2;
String minString = (str1.length() < str2.length())?str1:str2;
//这里需要注意的是如果maxString中出现了=号,
//那么minString就不能再出现一次=号,否则两者相同,比较就没有意义了
//这里我们是拿最小的字符串与最长的字符串进行比较
int length = minString.length();
for(int i = 0;i < length;i++)
{
for(int x = 0,y = length - i;y < length;y++,x++)
{
String sub = minString.substring(x,y);
if(maxString.contains(sub))
{
return sub;
}
}
}
}
}

当找不到时i会逐渐增大,而x会一直从0出发,y出发的下标会一直减小,以此类推
2.有关字符相关算法的长度为26的数组的基本解法
2.1 判断两个字符串是否为字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词,若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
这里我们可以用最为基础的建立一个长度为26的数组来存放26个字母
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length())
{
return false;
}
int[] arr = new int[26];
//利用ASCII表来进行字符之间的运算
for(int i = 0;i < s.length();i++)
{
arr[s.charAt(i) - 'a']++;
arr[t.charAt(i) - 'a']--;
}
//如果都为0,则true
for(int i = 0;i <26;i++)
{
if(arr[i] != 0)
return false;
}
return true;
}
}
2.2 当然还有一种利用长度为26数组的一种例子,
就是判断这两个字符串中出现的一个不同的字符是谁.
我们可以将两者字符串的每一个字符-'a'后进行运算相加,
总数大的减去小的,在利用+'a'得到该字符
3 反转字符串中的原因字符
3.1
示例1:输入:s = "hello"
输出:"holle"
这里我们将运用将String放入char型数组
class Solution {
public String reverseVowels(String s) {
int n = s.length();
char[] arr = s.toCharArray();
int i = 0,j = n - 1;
while(i < j)
{
//利用while循环直到找到元音字母
while(i < n && !getMain(arr[i]))
{
++i;
}
while(j > 0 && !getMain(arr[j]))
{
j--;
}
//必须符合i < j才能替换
if(i < j)
{
gettt(arr,i,j);
//满足条件继续循环
++i;
--j;
}
}
return new String(arr);
}
public boolean getMain(char a)
{
//判断该字符串是否存在元音字母字符
return "aeiouAEIOU".indexOf(a) >= 0;
}
public void gettt(char[] arr,int i,int j)
{
char temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
目前关于字符串的算法题笔记或小结到此结束,敬请指教
本文概述了如何解决字符串问题,包括求解最长公共前缀、判断字母异位词以及查找不同字符串中的最长相同部分。通过实例和基本算法实现,深入解析了字符数组和字符串操作技巧。
1249

被折叠的 条评论
为什么被折叠?



