String

作者: coderjiege | 来源:发表于2020-02-02 17:56 被阅读0次

    判断两个字符串是否互为变形词

    time = n(字符串长度), space = M(字符种类数)
    如果字符种类很多,可以用哈希表代替长度为256的整型数组

    public boolean isDeformation(String str1, String str2) {
        if (str1 == null || str2 == null || str1.length() != str2.length()) {
            return false;
        }
    
        char[] chas1 = str1.toCharArray();
        char[] chas2 = str1.toCharArray();
        int[] map = new int[256];
    
        for (char ch : chas1) {
            map[ch]++;
        }
        for (char ch : chas2) {
            if (map[ch]-- == 0) {
                return false;
            }
        }
        return true;
    }
    

    字符串中数字子串的求和

    time = n, space = 1
    数组操作一定要注意下标越界问题
    本题解法:负号和数字放一组解决

    public int numSum(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
    
        int minusNum = 0;
        int cur = 0;
        int sum = 0;
        char[] chas = str.toCharArray();
    
        for (int i = 0; i < chas.length;) {
            while (chas[i] == '-') {
                minusNum++;
                i++;
            }
            while (i < chas.length && Character.isDigit(chas[i])) {
                cur = cur * 10 + chas[i] - 48;
                i++;
            }
            if (cur == 0) {
                i++;
            } else {
                sum += (minusNum & 1) == 0 ? cur : -cur;
            }
            minusNum = 0;
            cur = 0;
        }
        return sum;
    }
    

    去掉字符串中连续出现k个0的子串

    time = n, space = 1
    注意:字符0和数字0不同,数字0在数组转回字符串时不会带入。
    字符数组中0值相当于没有赋值的状态

    public String removeKZeros(String str, int k) {
        if (str == null || str.length() == 0 || k < 1) {
            return str;
        }
    
        char[] chas = str.toCharArray();
        int start = -1;
        int count = 0;
    
        for (int i = 0; i < chas.length; i++) {
            if (chas[i] == '0') {
                count++;
                start = start == -1 ? i : start;
            } else {
                if (count == k) {
                    while (count-- != 0) {
                        chas[start++] = 0;
                    }
                }
                count = 0;
                start = -1;
            }
        }
    
        if (count == k) {
            while (count-- != 0) {
                chas[start++] = 0;
            }
        }
        return String.valueOf(chas);
    }
    

    判断两个字符串是否互为旋转词

    public boolean isRotation(String a, String b) {
        if (a == null || b == null || a.length() != b.length()) {
            return false;
        }
        String b2 = b + b;
        
        // return getIndexOf(b2, a) != -1 KMP算法
        return b2.contains(a);
    }
    

    替换字符串中连续出现的指定字符串

    先替换为0

    public String replace(String str, String from, String to) {
        if (str == null || from == null || to == null) {
            return str;
        }
    
        char[] chs = str.toCharArray();
        int match = 0;
        // 包含from部分转为0
        for (int i = 0; i < chs.length; i++) {
            match = chs[i] == from.charAt(match) ? match + 1 : 0;
            if (match == from.length()) {
                int j = i;
                while (match > 0) {
                    chs[j--] = '0';
                    match--;
                }
            }
        }
    
        // 0转为to
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < chs.length; i++) {
            if (chs[i] == '0') {
                if (i == chs.length - 1 || chs[i + 1] != '0') {
                    res.append(to);
                }
            } else {
                res.append(chs[i]);
            }
        }
        return res.toString();
    }
    

    字符串的统计字符串

    public String getCountString(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }
    
        char[] chs = str.toCharArray();
        char cur = chs[0];
        int num = 1;
        String res = "";
    
        for (int i = 1; i < chs.length; i++) {
            if (chs[i] == cur) {
                num++;
            } else {
                res = concat(res, chs, cur, num);
                num = 1;
                cur = chs[i];
            }
        }
        return concat(res, chs, cur, num);
    }
    
    public String concat(String res, char[] chs, char cur, int num) {
        return res + cur + '_' + num;
    }
    

    判断字符数组中是否所有的字符都只出现过一次

    // time = n
    public boolean isUniquel(char[] chas) {
        if (chas == null || chas.length < 2) {
            return true;
        }
    
        boolean[] map = new boolean[256];
        for (int i = 0; i < chas.length; i++) {
            if (map[chas[i]]) {
                return false;
            }
            map[chas[i]] = true;
        }
        return true;
    }
    

    字符串的调整与替换

    time = n, space = 1

    public void replace(char[] chas) {
        if (chas == null || chas.length == 0) {
            return;
        }
    
        // 字符数
        int charNum = 0;
        // 左半区长度
        int leftLen = 0;
        for (int i = 0; i < chas.length; i++) {
            if (Character.isLetter(chas[i])) {
                charNum++;
                leftLen = i + 1;
            }
        }
    
        int j = leftLen + (leftLen - charNum) * 2;
        for (int i = leftLen - 1; i >= 0; i--) {
            if (chas[i] == ' ') {
                chas[j--] = '0';
                chas[j--] = '2';
                chas[j--] = '%';
            } else {
                chas[j--] = chas[i];
            }
        }
    }
    

    翻转字符串

    time = n, space = 1
    先全部翻转,再按单词翻转

    public void ratateWord(char[] chas) {
        if (chas == null || chas.length == 0) {
            return;
        }
    
        reverse(chas, 0, chas.length - 1);
    
        int left = -1;
        int right = -1;
    
        for (int i = 0; i < chas.length; i++) {
            if (chas[i] != ' ') {
                if (i == 0 || chas[i - 1] == ' ') {
                    left = i;
                }
                if (i == chas.length - 1 || chas[i + 1] == ' ') {
                    right = i;
                }
            }
            if (left != -1 && right != -1) {
                reverse(chas, left, right);
                left = -1;
                right = -1;
            }
        }
    }
    
    public void reverse(char[] chas, int start, int end) {
        char tmp;
        while (start < end) {
            tmp = chas[start];
            chas[start] = chas[end];
            chas[end] = tmp;
            start++;
            end--;
        }
    }
    

    括号字符串的有效性

    public boolean isValid(String str) {
        if (str == null || str.length() == 0) {
            return false;
        }
    
        int leftNum = 0;
        int rightNum = 0;
        char[] chas = str.toCharArray();
        int len = chas.length;
    
        for (int i = 0; i != len; i++) {
            if (chas[i] == '(') {
                leftNum++;
            } else if (chas[i] == ')') {
                rightNum++;
            } else {
                return false;
            }
            if (rightNum > leftNum) {
                return false;
            }
        }
        if (rightNum == leftNum) {
            return true;
        }
        return false;
    }
    

    找到被指的新类型字符

    // 判断字符是不是数字
    Character.isDigit('c');
    // 判断字符是不是大写字母
    Character.isUpperCase('c');
    // 判断字符是不是小写字母
    Character.isLowerCase('c');

    public String pointNewchar(String s, int k) {
        if (s == null || s.length() == 0 || k < 0 || k >= s.length()) {
            return null;
        }
        
        // k前面连续大写字母的数量
        int upperNum = 0;
        char[] chas = s.toCharArray();
    
        for (int i = k - 1; i >= 0 ; i--) {
            if (!Character.isUpperCase(chas[i])) {
                break;
            }
            upperNum++;
        }
        
        if ((upperNum & 1) == 1) {
            return s.substring(k - 1, k + 1);
        }
        
        if (Character.isUpperCase(chas[k])) {
            return s.substring(k, k + 2);
        }
        return String.valueOf(chas[k]);
    }
    

    相关文章

      网友评论

        本文标题:String

        本文链接:https://www.haomeiwen.com/subject/mkbqxhtx.html