java常见算法

本文概述了如何解决字符串问题,包括求解最长公共前缀、判断字母异位词以及查找不同字符串中的最长相同部分。通过实例和基本算法实现,深入解析了字符数组和字符串操作技巧。

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;
    }
}

目前关于字符串的算法题笔记或小结到此结束,敬请指教

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海边的彩虹与你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值