【LeetBook】初级算法案例+java代码实现(字符串篇(1))

反转字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vt4s3XKG-1638589544653)(D:\SoftwareInstall\Typora\file\picture\image-20211204101654744.png)]

代码:

public void reverseString(char[] s) {
    char temp;
    int length=s.length;
    //注意i<length/2,即只需两边交换即可
    for(int i=0;i<length/2;i++){
        temp=s[i];
        s[i]=s[length-1-i];
        s[length-1-i]=temp;
    }
}

整数反转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEJd6J4j-1638589511416)(D:\SoftwareInstall\Typora\file\picture\image-20211204101320715.png)]

代码:

public int reverse(int x) {
    //判断有没有负号
    int flag = x > 0 ? 1 : -1;
    //把符号提出来
    x = Math.abs(x);
    try {
        //将字符串转化之后乘以flag,即还原符号
        return Integer.valueOf(new StringBuffer(String.valueOf(x)).reverse().toString()) * flag;
    } catch (NumberFormatException e) {
        return 0;
    }
}

字符串的第一个唯一字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQz1qx1z-1638589511417)(D:\SoftwareInstall\Typora\file\picture\image-20211204103329613.png)]

代码:

public int firstUniqChar(String s) {
    for (int i = 0; i < s.length(); i++) {
        char t = s.charAt(i);
        //当第一次出现该字符的索引和最后一次出现该字符的索引一致,说明该字符只有一个
        if (s.indexOf(t)==s.lastIndexOf(t)){
            return i;
        }
    }
    //如果上面没有返回,说明字符串的长度为0,或者每一个字符都有重复
    return -1;
}

有效的字母异位词

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-17gYHDRo-1638589511417)(D:\SoftwareInstall\Typora\file\picture\image-20211204105536797.png)]

代码:

public boolean isAnagram(String s, String t) {
    //若长度不相同,肯定使false
    if (s.length() != t.length()) {
        return false;
    }
    char[] sCharArr = s.toCharArray();
    char[] tCharArr = t.toCharArray();

    //数组的下表可以用字符来表示,因为后期会被自动转化为合适的索引
    //其实字符可以通过ASCII编码表转换为数字,而标准ASCII码字符集总共的编码有128个,所以声明数组的长度为128
    int[] temp = new int[128];

    for (char c : sCharArr) {
        temp[c]++;
    }

    for (char c : tCharArr) {
        temp[c]--;
    }

    for (int i = 0; i < temp.length; i++) {
        if (temp[i] != 0) {
            return false;
        }
    }

    return true;
}

验证回文串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RqOE68m-1638589511418)(D:\SoftwareInstall\Typora\file\picture\image-20211204110815827.png)]

代码:

public boolean isPalindrome(String s) {
    if (s.length() == 0) {
        return true;
    }
    //先将字符串的所有字母转化为小写
    s = s.toLowerCase();
    for (int i = 0, j = s.length() - 1;i < j; i++, j--) {
        //跳过不是数字和字母的其他字符
        while (i < j && !Character.isLetterOrDigit(s.charAt(i))) {
            i++;
        }
        //跳过不是数字和字母的其他字符
        while (i < j && !Character.isLetterOrDigit(s.charAt(j))) {
            j--;
        }
        if (s.charAt(i) != s.charAt(j)) {
            return false;
        }
    }
    return true;
}

字符串转换整数 (atoi)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lhfgPjtG-1638589511419)(D:\SoftwareInstall\Typora\file\picture\image-20211204114219879.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dRAs2c80-1638589511420)(D:\SoftwareInstall\Typora\file\picture\image-20211204114233472.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtLRLSh4-1638589511420)(D:\SoftwareInstall\Typora\file\picture\image-20211204114243457.png)]

代码:

public int myAtoi(String s) {
    if (s.length() == 0) {
        return 0;
    }
    char[] sCharArr = s.toCharArray();
    int index = 0;
    //读入字符串并丢弃无用的前导空格
    //跳过空格
    while (index<sCharArr.length&&sCharArr[index] == ' ') {
        index++;
    }
    // 字符串为全空格
    if (index == sCharArr.length) {
        return 0;
    }
    //检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
    int flag = 1;
    //如果该字符为'-','+',index++
    if (sCharArr[index] == '-' || sCharArr[index] == '+') {
        if (sCharArr[index++] == '-') {
            flag = -1;
        }
    }
    //读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
    String tempStr = "";
    while (index < sCharArr.length) {
        if (sCharArr[index] < '0' || sCharArr[index] > '9') {
            break;
        } else {
            tempStr += sCharArr[index];
        }
        index++;
    }
    //将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
    //如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
    //返回整数作为最终结果。
    if (tempStr.equals("")){
        return 0;
    }
    try{
        return Integer.valueOf(tempStr)*flag;
    } catch (NumberFormatException e) {
        return flag==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
    }

}

由于小编如今面临苦逼的期末考试,先暂时更新一部分,感兴趣的同学可以上初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)进行进一步的学习。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Java代码实现: ``` public class CommonSubstring { public static String findCommonSubstring(String str1, String str2) { int m = str1.length(); int n = str2.length(); int[][] L = new int[m + 1][n + 1]; int len = 0, row = 0, col = 0; for (int i = 0; i <= m; i++) { for (int j = 0; j <= n; j++) { if (i == 0 || j == 0) { L[i][j] = 0; } else if (str1.charAt(i - 1) == str2.charAt(j - 1)) { L[i][j] = L[i - 1][j - 1] + 1; if (L[i][j] > len) { len = L[i][j]; row = i; col = j; } } else { L[i][j] = 0; } } } if (len == 0) { return ""; } StringBuilder sb = new StringBuilder(); while (L[row][col] != 0) { sb.insert(0, str1.charAt(row - 1)); row--; col--; } return sb.toString(); } public static void main(String[] args) { String str1 = "abcdefg"; String str2 = "defghijk"; System.out.println("Two strings: " + str1 + ", " + str2); System.out.println("Common substring: " + findCommonSubstring(str1, str2)); } } ``` 在这个示例中,我们首先定义了一个名为`findCommonSubstring()`的静态方法,它接收两个字符串`str1`和`str2`作为参数。我们使用一个二维数组`L`来存储计算出的最大公共子字符串的长度,并使用三个变量`len`、`row`和`col`来跟踪最大公共子字符串的长度、行索引和列索引。我们使用两个嵌套的for循环来计算`L`数组中的所有元素。如果当前字符匹配,则将`L[i][j]`设置为`L[i-1][j-1]+1`,并检查是否需要更新`len`、`row`和`col`。如果两个字符不匹配,则将`L[i][j]`设置为0。最后,我们检查`len`是否为0,如果是,则返回一个空字符串,否则将最大公共子字符串添加到一个StringBuilder对象中,并返回它的字符串表示形式。 在`main()`方法中,我们定义了两个字符串`str1`和`str2`,并调用`findCommonSubstring()`方法来查找它们的最大公共子字符串。最后,我们将结果打印到控制台上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hello Dam

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

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

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

打赏作者

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

抵扣说明:

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

余额充值