Leetcode字符串题(Java作答)

目录

目录

13.罗马数字转整数

344.反转字符串

28.实现strStr()

125.验证回文串

14.最长公共前缀

551.学生出勤记录I

657.机器人能否返回原点

20.有效的括号

67.二进制求和

1071.字符串的最大公因子

58.最后一个单词的长度

415.字符串相加

696.计数二进制字串

520.检测大写字母

面试题01.06.字符串压缩

409.最长回文串


13.罗马数字转整数

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: "III"
输出: 3
示例 2:

输入: "IV"
输出: 4
示例 3:

输入: "IX"
输出: 9
示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/roman-to-integer

class Solution {
    public int romanToInt(String s) {
        int sum=0;
        int num=0;
        int numAfter=0;
        for(int i=s.length()-1;i>=0;i--){
            if(s.charAt(i)=='I'){
                num=1;
            }else if(s.charAt(i)=='V'){
                num=5;
            }else if(s.charAt(i)=='X'){
                num=10;
            }else if(s.charAt(i)=='L'){
                num=50;
            }else if(s.charAt(i)=='C'){
                num=100;
            }else if(s.charAt(i)=='D'){
                num=500;
            }else if(s.charAt(i)=='M'){
                num=1000;
            }
            if(numAfter>num){
                sum-=num;
            }else{
                sum+=num;
            }
            numAfter=num;
        }
        return sum;
    }
}

344.反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string

class Solution {
    public void reverseString(char[] s) {
        char a=' ';
        for(int i=0;i<s.length/2;i++){
            a=s[i];
            s[i]=s[s.length-1-i];
            s[s.length-1-i]=a;
        }
    }
}

28.实现strStr()

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr

class Solution {
    public int strStr(String haystack, String needle) {
        boolean flag=false;
        int index=0;
        if(needle.length()==0){
            return 0;
        }
        for(int i=0;i<=haystack.length()-needle.length();){
            index=i;
            for(int j=0;j<needle.length();){
                if(haystack.charAt(i)==needle.charAt(j)){
                    i++;
                    j++;
                }else{
                    j=0;
                    i=index+1;
                    break;
                }
                if(j==needle.length()){
                    flag=true;
                }
            }
            if(flag){
                break;
            }
        }
        if(flag){
            return index;
        }else{
            return -1;
        }
    }
}

125.验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:

输入: "race a car"
输出: false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome

class Solution {
    public boolean isPalindrome(String s) {
        boolean flag=true;
        int i=0;
        int j=s.length()-1;
        char word1=' ';
        char word2=' ';
        while(i<j){
            if(s.charAt(i)>='A'&&s.charAt(i)<='Z'){
                word1=(char)((int)s.charAt(i)+32);
            }else if(s.charAt(i)>='a'&&s.charAt(i)<='z'){
                word1=s.charAt(i);
            }else if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
                word1=s.charAt(i);
            }else{
                i++;
                continue;
            }
            if(s.charAt(j)>='A'&&s.charAt(j)<='Z'){
                word2=(char)((int)s.charAt(j)+32);
            }else if(s.charAt(j)>='a'&&s.charAt(j)<='z'){
                word2=s.charAt(j);
            }else if(s.charAt(j)>='0'&&s.charAt(j)<='9'){
                word2=s.charAt(j);
            }else{
                j--;
                continue;
            }
            i++;
            j--;
            if(word1!=word2){
                flag=false;
                break;
            }
        }
        return flag;
    }
}

14.最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0){
            return "";
        }
        int minLen=strs[0].length();
        for(int i=0;i<strs.length;i++){
            if(strs[i].length()<minLen){
                minLen=strs[i].length();
            }
        }
        String ans="";
        boolean flag=true;
        char[] chars=new char[minLen];
        for(int i=0;i<minLen;i++){
            flag=true;
            for(int j=0;j<strs.length-1;j++){
                if(strs[j].charAt(i)!=strs[j+1].charAt(i)){
                    flag=false;
                    break;
                }
            }
            if(flag){
                ans+=strs[0].charAt(i);
            }else{
                break;
            }
        }
        
        return ans;
    }
}

551.学生出勤记录I

给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:

'A' : Absent,缺勤
'L' : Late,迟到
'P' : Present,到场
如果一个学生的出勤记录中不超过一个'A'(缺勤)并且不超过两个连续的'L'(迟到),那么这个学生会被奖赏。

你需要根据这个学生的出勤记录判断他是否会被奖赏。

示例 1:

输入: "PPALLP"
输出: True
示例 2:

输入: "PPALLL"
输出: False

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/student-attendance-record-i

class Solution {
    public boolean checkRecord(String s) {
        int count_A=0;
        int count_L=0;
        boolean flag=true;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='A'){
                count_A++;
                count_L=0;
            }else if(s.charAt(i)=='L'){
                count_L++;
            }else{
                count_L=0;
            }
            if(count_A==2||count_L==3){
                flag=false;
                break;
            }
        }
        return flag;
    }
}

657.机器人能否返回原点

在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。

移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。

注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。

 

示例 1:

输入: "UD"
输出: true
解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。
示例 2:

输入: "LL"
输出: false
解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/robot-return-to-origin

class Solution {
    public boolean judgeCircle(String moves) {
        int x=0;
        int y=0;
        for(int i=0;i<moves.length();i++){
            if(moves.charAt(i)=='U'){
                y++;
            }else if(moves.charAt(i)=='D'){
                y--;
            }else if(moves.charAt(i)=='R'){
                x++;
            }else if(moves.charAt(i)=='L'){
                x--;
            }
        }
        if(x==0&&y==0){
            return true;
        }else{
            return false;
        }
    }
}

20.有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

class Solution {
    public boolean isValid(String s) {
        char[] chars=new char[s.length()];
        int top=-1;
        for(int i=0;i<s.length();i++){
            if(top==-1||(s.charAt(i)!=chars[top]+1&&s.charAt(i)!=chars[top]+2)){
                chars[top+1]=s.charAt(i);
                top++;
            }else{
                top--;
            }
        }
        return top==-1;
    }
}

67.二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

示例 1:

输入: a = "11", b = "1"
输出: "100"
示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary

class Solution {
    public String addBinary(String a, String b) {
        int jinwe=0;
        String num="";
        int num1=0;
        int num2=0;
        String Num="";
        for(int k=1;k<=Math.abs(a.length()-b.length());k++){
            Num+='0';
        }
        if(a.length()>b.length()){
            Num+=b;
            b=Num;
        }else{
            Num+=a;
            a=Num;
        }
        for(int i=a.length()-1;i>=0;i--){
            if(a.charAt(i)=='0'){
                num1=0;
            }else{
                num1=1;
            }
            if(b.charAt(i)=='0'){
                num2=0;
            }else{
                num2=1;
            }
            switch(num1+num2+jinwe){
                case 0:
                    num+='0';
                    break;
                case 1:
                    num+='1';
                    if(jinwe==1){
                        jinwe=0;
                    }
                    break;
                case 2:
                    num+='0';
                    if(i==0){
                        num+='1';
                    }
                    jinwe=1;
                    break;
                case 3:
                    num+='1';
                    if(i==0){
                        num+='1';
                    }
                    jinwe=1;
                    break;
            }
        
        }
        String ans="";
        for(int z=num.length()-1;z>=0;z--){
            ans+=num.charAt(z);
        }
        return ans;
    }
}

1071.字符串的最大公因子

对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。

返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。

 

示例 1:

输入:str1 = "ABCABC", str2 = "ABC"
输出:"ABC"
示例 2:

输入:str1 = "ABABAB", str2 = "ABAB"
输出:"AB"
示例 3:

输入:str1 = "LEET", str2 = "CODE"
输出:""
 

提示:

1 <= str1.length <= 1000
1 <= str2.length <= 1000
str1[i] 和 str2[i] 为大写英文字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings

class Solution {
    public String gcdOfStrings(String str1, String str2){
        String maxStr="";
        String minStr="";
        if(str1.length()>=str2.length()){
            maxStr=str1;
            minStr=str2;
        }else{
            maxStr=str2;
            minStr=str1;
        }
        int i=1;
        String ansStr="";
        boolean flag=true;
        while(true){
            flag=true;
            ansStr=minStr.substring(0,minStr.length()/i);
            for(int j=0;j+minStr.length()/i<=minStr.length();){
                if(!ansStr.equals(minStr.substring(j,j+minStr.length()/i))){
                    flag=false;
                    break;
                }else{
                    j+=minStr.length()/i;
                }
            }
            for(int j=0;j+minStr.length()/i<=maxStr.length();){
                if(!ansStr.equals(maxStr.substring(j,j+minStr.length()/i))){
                    flag=false;
                    break;
                }else{
                    j+=minStr.length()/i;
                }
            }
            if(maxStr.length()%(minStr.length()/i)!=0){
                flag=false;
            }
            if(flag|minStr.length()/i==1){
                break;
            }
            i++;
        }
        if(flag){
            return ansStr;
        }else{
            return "";
        }
    }
}

58.最后一个单词的长度

给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。

 

示例:

输入: "Hello World"
输出: 5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-last-word

class Solution {
    public int lengthOfLastWord(String s) {

        int i=s.length()-1;
        if(i==-1){
            return 0;
        }
        int count=0;
        while(true){
            if(s.charAt(i)!=' '){
                count++;
            }
            i--;
            if(i==-1){
                break;
            }
            if(count!=0){
                if(s.charAt(i)==' '){
                    break;
                }
            }
        }
        return count;
    }
}

415.字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-strings

class Solution {
    public String addStrings(String num1, String num2) {
        int n1=0;
        int n2=0;
        int jinwei=0;
        String num="";
        String n0="";
        for(int i=1;i<=Math.abs(num1.length()-num2.length());i++){
            n0+='0';
        }
        if(num1.length()>=num2.length()){
            n0+=num2;
            num2=n0;
        }else{
            n0+=num1;
            num1=n0;
        }
        for(int i=num1.length()-1;i>=0;i--){
            n1=(int)num1.charAt(i)-48;
            n2=(int)num2.charAt(i)-48;
            if(n1+n2+jinwei<10){
                num+=(char)(n1+n2+jinwei+48);
                jinwei=0;
            }else{
                num+=(char)((n1+n2+jinwei)%10+48);
                jinwei=1;
                if(i==0){
                    num+='1';
                }
            }
        }
        String ans="";
        for(int i=num.length()-1;i>=0;i--){
            ans+=num.charAt(i);
        }
        return ans;
    }
}

696.计数二进制字串

给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。

重复出现的子串要计算它们出现的次数。

示例 1 :

输入: "00110011"
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。

请注意,一些重复出现的子串要计算它们出现的次数。

另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
示例 2 :

输入: "10101"
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
注意:

s.length 在1到50,000之间。
s 只包含“0”或“1”字符。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-binary-substrings

class Solution {
    public int countBinarySubstrings(String s) {
        int ans=0;
        int count_now=0;
        int count_new=0;
        int i=0;
        int j=0;
        while(true){
            if(i>s.length()-1){
                break;
            }
            if(s.charAt(i)==s.charAt(j)){
                count_new++;
                i++;
            }else{
                ans+=Math.min(count_new,count_now);
                count_now=count_new;
                count_new=0;
                j=i;
            }
            if(i-1==s.length()-1){
                ans+=Math.min(count_new,count_now);
            }
        }
        return ans;
    }
}

520.检测大写字母

给定一个单词,你需要判断单词的大写使用是否正确。

我们定义,在以下情况时,单词的大写用法是正确的:

全部字母都是大写,比如"USA"。
单词中所有字母都不是大写,比如"leetcode"。
如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。
否则,我们定义这个单词没有正确使用大写字母。

示例 1:

输入: "USA"
输出: True
示例 2:

输入: "FlaG"
输出: False
注意: 输入是由大写和小写拉丁字母组成的非空单词。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/detect-capital

class Solution {
    public boolean detectCapitalUse(String word) {
        boolean flag=true;
        for(int i=0;i<word.length();i++){
            if(!(word.charAt(i)>='A'&&word.charAt(i)<='Z')){
                flag=false;
            }
        }
        if(flag){
            return true;
        }

        flag=true;
        for(int i=0;i<word.length();i++){
            if(!(word.charAt(i)>='a'&&word.charAt(i)<='z')){
                flag=false;
            }
        }
        if(flag){
            return true;
        }

        flag=true;
        if(!(word.charAt(0)>='A'&&word.charAt(0)<='Z')){
            flag=false;
        }
        for(int i=1;i<word.length();i++){
            if(!(word.charAt(i)>='a'&&word.charAt(i)<='z')){
                flag=false;
            }
        }
        if(flag){
            return true;
        }
        return false;
    }
}

面试题01.06.字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

 输入:"aabcccccaaa"
 输出:"a2b1c5a3"
示例2:

 输入:"abbccd"
 输出:"abbccd"
 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:

字符串长度在[0, 50000]范围内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci

class Solution {
    public String compressString(String S) {
        int i=0;
        int j=0;
        String ans="";
        int count=0;
        while(true){
            if(i>=S.length()){
                break;
            }
            if(S.charAt(i)==S.charAt(j)){
                count++;
            }else{
                ans+=S.charAt(j);
                ans+=String.valueOf(count);
                count=1;
                j=i;
            }
            if(i==S.length()-1){
                ans+=S.charAt(j);
                ans+=String.valueOf(count);
                count=1;
                j=i;
            }
            i++;
        }
        if(S.length()<=ans.length()){
            return S;
        }else{
            return ans;
        }
    }
}

409.最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

示例 1:

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
class Solution {
    public int longestPalindrome(String s) {
        int[] nums = new int[123];
        for(int i=0;i<s.length();i++){
                nums[s.charAt(i)]++;
        }
        int sum=0;
        int max=0;
        boolean flag=false;
        for(int i=0;i<123;i++){
            if(nums[i]%2==0){
                sum+=nums[i];
            }else{
                sum+=nums[i]-1;
                flag=true;
            }
        }
        if(flag){
            sum+=1;
        }
        return sum;
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值