由于最近学校恢复线下授课,我也就没有那么多空余时间了,所以博客暂时停更了一段时间,今天先给大家带来三道经典字符串oj题,SE部分的博客以后都会补上的~~~🌹🌹

在开发和校招笔试面试中,字符串都是常客,所以字符串是非常重要的,所以学好字符串是非常有必要的,先来三道oj题开开胃!

🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗


1. 字符串中的第一个唯一字符

在这里插入图片描述

这是力扣上的一道题,以上是题目的信息。

注意这道题有一个特点,字符串s只包含小写字母,a的ascii码值是97,一共有26个小写字母,所以我们可以定义一个数组,定义一个i来遍历s的内容,把一个字符作为一个下标,每遇到一个字符,便让数组中这个下标处的元素+1(每个元素都初始化为0)。遍历完s后,数组中的内容也就填充完毕了,这时候可以确定哪些字符只出现了一次,但是怎么确定哪个是第一个唯一字符呢?

只需要回到s的首字符,再重新遍历一下s(因为只有通过s才能确定字符的顺序),同时判定数组中的某个元素是否为1,这样就可以确定第一个唯一字符了。接下来我们画图详解并优化一下~

在这里插入图片描述
具体代码实现:

(其中的类和firstUniqChar方法是题目给定的)

在这里插入图片描述
在这里插入图片描述

//对参数进行判断
        if(s == null || s.length() == 0) {
            return -1;
        }

        //字符串中只包含小写字母,所以数组长度为26
        int[] arr = new int[26];

        //遍历字符串,填充数组元素
        for(int i=0; i<s.length(); i++) {
            char ch = s.charAt(i);
            //数组从0下标开始,所以要减去97('a')
            arr[ch-'a']++;
        }

        //回到字符串首位置,再次遍历数组,找到第一个不重复的字符(arr[ch-'a'] == 1)
        for(int i=0; i<s.length(); i++) {
            char ch = s.charAt(i);
            if(arr[ch-'a'] == 1) {
                return i;
            }
        }
        //不存在
        return -1;

🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧


2. 字符串最后一个单词的长度

在这里插入图片描述
题目信息如上~

该题我们降低一下难度,允许使用Java提供的库方法。

这道题我们讲两种解法,一是用split进行分隔,得到每个单词后输出最后一个单词的长度;二是用substring进行截取,由题意得,字符串末尾不以空格为结尾,单词又以空格隔开,所以我们可以先用lastInderOf获取最后一个空格的下标,再进行截取获得最后一个单词然后输出长度即可。

具体代码如下:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();//因为输入包含空格,所以要用nextLine
        //方法1,分隔
        //String[] s = str.split(" ");
        //System.out.println( s[s.length - 1].length());
        
        //方法2:截取
        int index = str.lastIndexOf(" ");
        String ret = str.substring(index + 1);//index是空格的下标,所以要加1
        System.out.println(ret.length());
    }
}

🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕

3. 验证回文串

在这里插入图片描述
什么是回文串?样如abccba样式的字符串,即左右一一对称。

这道题要更加复杂一点,除了字母还有其他字符,但这道题只考虑字母和数字,也就是说字母和数字才是合法字符,除此之外的字符都可以跳过;其次可以忽略字符的大小写,那么我们就可以把整个字符串都转为大写或转为小写,通过判断字符的ascii码的范围来判断其是否合法。

代码如下:

(其中的类和isPalindrome方法是题目给定的,大家可以自己去力扣上搜一下这道题)

在这里插入图片描述

在这里插入图片描述

class Solution {

    //判断是否为合法字符
    private boolean isLegalCharacter(char ch) {
        if(ch>='0' && ch<='9' || ch>='a' && ch<='z') {
            return true;
        }
        return false;
    }

    public boolean isPalindrome(String s) {
        //1. 判断是否为数字和字母(判断其ascii码的范围)
        //2. 忽略大小写,那么就把整个字符串都转为大写或小写

        //转为小写
        s = s.toLowerCase();
        int left = 0;
        int right = s.length() - 1;
        while(left < right) {
            //判断左边字符是否为合法字符
            while(left < right && !isLegalCharacter(s.charAt(left))) {
                left++;
            }

            //判断右边字符是否为合法字符
            while(left < right && !isLegalCharacter(s.charAt(right))) {
                right--;
            }

            //此时左右两边字符都为合法字符
            if(s.charAt(left) != s.charAt(right)) {
                return false;
            } else {
                //说明相等,那就继续判断下两个字符
                left++;
                right--;
            }
        }
        //是回文串
        return true;
    }
}

🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔

看到这里恭喜你又刷完了三道oj题,再次强调字符串是很重要的,所以一定要学好它!!!👊👊💪

最后希望大家给个三连支持一下吧!!!