美文网首页
字符串题目

字符串题目

作者: 卡路fly | 来源:发表于2020-05-20 03:10 被阅读0次

    4. 替换空格为『%20』

    思路:从后往前遍历,【替换为02%】

     public String replaceSpace(StringBuffer str) {
            StringBuffer res = new StringBuffer();
            int len = str.length() - 1;
            for(int i = len; i >= 0; i--){
                if(str.charAt(i) == ' ')
                    res.append("02%");
                else
                    res.append(str.charAt(i));
            }
            return res.reverse().toString();
        }
    

    28. 字符串的排列

    描述

    输入一个字符串,按字典序打印出该字符串中字符的所有排列。(字符串长度不超过9(可能有字符重复),字符只包括大小写字母)

    例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    思路

    1. 求所有可能出现在第一个位置的字符(即把第一个字符和后面的所有字符交换[相同字符不交换])
    2. 固定第一个字符,求后面所有字符的排列。这时候又可以把后面的所有字符拆成两部分(第一个字符以及剩下的所有字符),依此类推。
    public ArrayList<String> Permutation(String str) { 
            ArrayList<String> list = new ArrayList<>();
            if(str.length()==0||str==null)
                return list;
            
            helper(list,str.toCharArray(),0);
            Collections.sort(list);
            
            return list;
        }
       
        public void helper(ArrayList<String> list, char[] str, int i) {
            if (i == str.length) {
                list.add(String.valueOf(str));
            } else {
                for (int j = i; j < str.length; j++) {
                    if (j != i && str[i] == str[j]) {
                        continue;
                    }
                    swap(str, i, j);
                    helper(list, str, i + 1);
                    swap(str, i, j);
                }
            }
        }
    

    42. 翻转单词顺序

    “student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。

    思路:先翻转整个字符串,再翻转每个单词

       public String ReverseSentence(String str) {
            // String str = "i am a student.";
            if (str == null || str.length() == 0)
                return "";
            if (str.trim().equals(""))
                return str;
            str = new StringBuilder(str).reverse().toString();
            // str=".tneduts a ma I"
            String ss[] = str.split(" ");
            String res = new StringBuilder(ss[0]).reverse().toString();
            for (int i = 1; i < ss.length; i++) {
                res = res + " " + (new StringBuilder(ss[i]).reverse().toString());
            }
            return res;
        }
    

    42. 左旋转字符串

    描述

    符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”

    思路

    方法一:两个字符串拼接
    方法二:字符串分为两部分【abc】【XYZdef】,分别翻转后为【cbafedZYX】,再整体翻转【XYZdefabc】

    public String LeftRotateString(String str,int n) {
            int len = str.length();
            if(len == 0)
                return "";
            n = n % len;
            String s1 = str.substring(n, len);
            String s2 = str.substring(0, n);
            return s1+s2;
        }
    

    39. 把字符串转换成整数

    思路

    注意上下溢出
    常规思路,先判断第一位是不是符号位,如果有符号,有flag 做标记。
    遍历字符串中的每个字符,如果存在非数字的字符,直接返回 0,否则,用当前字符减去’0’得到当前的数字,再进行运算。

       public int StrToInt(String str) {
            if (str == null || str.length() == 0)
                return 0;
            int start;
            int tag;
            if (str.charAt(0) == '+') {
                tag = 1;
                start = 1;
            } else if (str.charAt(0) == '-') {
                tag = 0;
                start = 1;
            } else {
                tag = 1;
                start = 0;
            }
            long result = 0;
            for (int i = start; i < str.length(); i++) {
                char tmp = str.charAt(i);
                if (tmp >= '0' && tmp <= '9') {
                    result = result * 10 + (tmp - '0');
                    if (tag == 1 && result > Integer.MAX_VALUE)
                        throw new RuntimeException("上溢出");
                    if (tag == 0 && result < Integer.MIN_VALUE)
                        throw new RuntimeException("下溢出");
                } else {
                    return 0;
                }
            }
    
            if (tag == 0)
                return (int) (-1 * result);
            else {
                return (int) result;
            }
        }
    

    53. 正则表达式匹配

    描述

    请实现一个函数用来匹配包括’.’和’’的正则表达式。模式中的字符’.’表示任意一个字符,而’’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”ab*a”均不匹配

    思路

    当模式中的第二个字符不是“*”时:

    1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。

    2、如果 字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。

    而当模式中的第二个字符是“*”时:

    如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹配方式:

    1、模式后移2字符,相当于x*被忽略;

    2、字符串后移1字符,模式后移2字符;

    3、字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位。

    public boolean match(char[] str, char[] pattern) {
            int sindex = 0, pindex = 0;
            return matchCore(str, sindex, pindex, pattern);
        }
    
        public boolean matchCore(char[] str, int sindex, int pindex, char[] pattern) {
            if (sindex >= str.length && pindex == pattern.length)
                return true;
            if (pindex >= pattern.length && sindex < str.length)
                return false;
            if (pindex + 1 < pattern.length && pattern[pindex + 1] == '*') {
                if (sindex < str.length && (str[sindex] == pattern[pindex] || pattern[pindex] == '.')) {
                    return matchCore(str, sindex, pindex + 2, pattern) ||
                            matchCore(str, sindex + 1, pindex + 2, pattern) ||
                            matchCore(str, sindex + 1, pindex, pattern);
                } else {
                    return matchCore(str, sindex, pindex + 2, pattern);
                }
            }
            if (sindex < str.length && (str[sindex] == pattern[pindex] || pattern[pindex] == '.'))
                return matchCore(str, sindex + 1, pindex + 1, pattern);
            return false;
        }
    

    相关文章

      网友评论

          本文标题:字符串题目

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