算法-字符串相关算法合集

  • 字符串相加
fun addStrings(num1: String, num2: String): String {
    val l1 = num1.length
    val l2 = num2.length
    var i = l1 - 1
    var j = l2 - 1
    var signal = 0
    var result = ""
    while (i >= 0 || j >= 0 || signal == 1) {
        val n1 = if (i >= 0) num1[i] - '0' else 0
        val n2 = if (j >= 0) num2[j] - '0' else 0
        val sum = n1 + n2 + signal
        signal = if (sum >= 10) 1 else 0
        result = (sum % 10).toString() + result
        i--
        j--
    }
    return result
}
  • 字符串相乘
fun multiply(num1: String, num2: String): String {
    if (num1 == "0" || num2 == "0") {
        return "0"
    }
    val list = IntArray(num1.length + num2.length)
    list.forEachIndexed { index, _ -> list[index] = 0 }
    for (i in num1.indices.reversed()) {
        for (j in num2.indices.reversed()) {
            var index = num1.length + num2.length - i - j - 2
            var temp = (num1[i] - '0') * (num2[j] - '0') + list[index]
            list[index++] = temp % 10
            while (temp >= 10 && index < list.size) {
                temp = temp / 10 + list[index]
                list[index++] = temp % 10
            }
        }
    }
    val start = if (0 == list[list.size-1]) 1 else 0
    return list.reversed().subList(start, list.size).joinToString(separator = "")
}
  • 最长子串
fun lengthOfLongestSubstring(s: String): Int {
    val map = HashMap<Int, Char>()
    var max = 0
    var left = 0
    for (i in s.indices) {
        if (map.containsValue(s[i])) {
            while (map[left] != s[i]) {
                map.remove(left++)
            }
            map.remove(left++)
        }
        map[i] = s[i]
        if (i - left + 1 > max) {
            max = i - left + 1
        }
    }
    return max
}
  • 最长子串 优化版

  • 思路类似 容器进行优化:只需使用整型数组 (index,data) index存放char的值 data存放char的序号

  • 遍历字符串时遇到第二次同一个index时, 更新index对应的data值 并且更新最长子串长度数值

fun lengthOfLongestSubstring(s: String): Int {
    val pos = IntArray(256)
    pos.fill(-1, 0, pos.size)
    var st = 0
    var res = 0
    for (i in s.indices) {
        val index = s[i].toInt()
        if (pos[index] < st) {
            res = max(res, i - st + 1)
        } else {
            st = pos[index] + 1
        }
        pos[index] = i
    }
    return res
}
  • Z字型变换
public String convert(String s, int numRows) {
    if (s.length() <= 2 || numRows == 1 || s.length() <= numRows) {
        return s;
    }
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < numRows; i++) {
        if (s.isEmpty()) break;
        boolean willAdd = true;
        int temp = i;
        builder.append(s.charAt(temp));
        if (2 * (numRows -1-i) == 0)
            willAdd = false;
        temp += 2 * (numRows -1-i);
        while (temp < s.length()) {
            if (willAdd) builder.append(s.charAt(temp));
            if (i == 0) willAdd = false; else  willAdd = true;
            temp += 2 * i;
            if (temp >= s.length()) break;
            if (willAdd) builder.append(s.charAt(temp));
            if (2 * (numRows -1-i) == 0) willAdd = false; else  willAdd = true;
            temp += 2 * (numRows -1-i);
        }
    }

    return builder.toString();
}
  • 有效的括号
private static Character[] c1 = {'(', '[', '{'};
private static Character[] c2 = {')', ']', '}'};

public boolean isValid(String s) {
    if (s.length() == 0) return true;
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < s.length(); ++i) {
        char c = s.charAt(i);
        if (contain(c1, c)) stack.push(c);
        else if (contain(c2, c)) {
            if (stack.isEmpty()) return false;
            if (match(stack.peek(), c)) stack.pop();
            else return false;
        }
    }
    if (stack.isEmpty()) return true;
    return false;
}

private boolean contain(Character[] cs, char c) {
    for (int i = 0; i < cs.length; ++i) {
        if (c == cs[i]) return true;
    }
    return false;
}

private boolean match(char a, char b) {
    if ((a == '(' && b == ')') || (a == '[' && b == ']') || (a == '{' && b == '}')) return true;
    else return false;
}
  • 括号生成
private List<String> result = new ArrayList<>();

public List<String> generateParenthesis(int n) {
    fun(n, n, 0, n, "");
    return result;
}

private void fun(int lNum, int rNum, int lNow, int n, String temp) {
    if (lNow > 0) {
        if (lNum > 0) {
            fun(lNum - 1, rNum, lNow + 1, n, temp + '(');
            String t = temp.substring(0, n * 2 - lNum - rNum) + ')';
            fun(lNum, rNum - 1, lNow - 1, n, t);
        } else
            fun(lNum, rNum - 1, lNow - 1, n, temp + ')');
    } else {
        if (lNum == 0)
            result.add(temp);
        else
            fun(lNum - 1, rNum, lNow + 1, n, temp + '(');
    }
}

More info: CSDN

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值