目录

每日算法(二)–字符串

字符串中数字子串的求和

思路: 利用3个变量

// 目前的累加和
int res 
// 当前收集到的数字
int num
// num的正负值
boolean posi
public int numSum(String str) {
        if (str == null) return 0;
        char[] charArr = str.toCharArray();
        int res = 0;
        int num = 0;
        boolean posi = true;
        int cur = 0;
        for (int i = 0; i < charArr.length; i++) {
            cur = charArr[i] - '0';
            // 不属于字母 0 ~ 9
            if (cur < 0 || cur > 9) {
                res += num;
                num = 0;
                // 如果等于-
                if (charArr[i] == '-') {
                    // 前面还有个-号
                    if (i - 1 > -1 && charArr[i - 1] == '-') {
                        posi = !posi;
                        // 否则就直接改为符号
                    } else {
                        posi = false;
                    }
                } else {
                    posi = true;
                }
                // 不属于0 ~ 9
            } else {
                num = num * 10 + (posi ? cur : -cur);
            }
        }
        res += num;
        return res;
    }

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

如果一个字符串st,把字符串str前面任意的部分挪到后面形成的字符串叫作str的旋转词。比如str”12345”,str的旋转词有”12345”、”23451”、”34512”、”45123”和”51234”。 给定两个字符串a和b,请判断a和b是否互为旋转词。

要求: 如果a和b长度不一样,那么a和b必然不互为旋转词,可以直接返回 false。当a和b长度一样,都为N时,要求解法的时间复杂度为O(N)

这里的是要求时间复杂度为O(N) 如果用库函数是不能满足要求的 得使用KMP算法

思路: 让第二个字符串生成一个大串 判断是否存在

	public static 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 Algorithm
	public static int getIndexOf(String s, String m) {
		if (s.length() < m.length()) {
			return -1;
		}
		char[] ss = s.toCharArray();
		char[] ms = m.toCharArray();
		int si = 0;
		int mi = 0;
		int[] next = getNextArray(ms);
		while (si < ss.length && mi < ms.length) {
			if (ss[si] == ms[mi]) {
				si++;
				mi++;
			} else if (next[mi] == -1) {
				si++;
			} else {
				mi = next[mi];
			}
		}
		return mi == ms.length ? si - mi : -1;
	}

	public static int[] getNextArray(char[] ms) {
		if (ms.length == 1) {
			return new int[] { -1 };
		}
		int[] next = new int[ms.length];
		next[0] = -1;
		next[1] = 0;
		int pos = 2;
		int cn = 0;
		while (pos < next.length) {
			if (ms[pos - 1] == ms[cn]) {
				next[pos++] = ++cn;
			} else if (cn > 0) {
				cn = next[cn];
			} else {
				next[pos++] = 0;
			}
		}
		return next;
	}

字符串的统计子串

给定一个字符串str,返回str的统计字符串。例如,” aaabbadddff”的统计字符串为 “a_3_b_2_a_l_d_3_f_2_c_l”

public static String staitisNum(String str) {
        if (str == null || str.length() == 0) return "";
        char cur = 0;
        int sum = 0;
        StringBuffer sb = new StringBuffer();
        char[] chars = str.toCharArray();
        String strs = null;
        for (int i = 0; i < chars.length; i++) {
            if (cur == 0) {
                cur = chars[i];
                sum = 1;
            } else if (chars[i] == cur) {
                sum++;
            } else {
                strs = cur + "_" + sum + "_";
                sb.append(strs);
                cur = chars[i];
                sum = 1;
            }
        }
        sb.append(cur + "_" + sum);
        return sb.toString();
    }
// 时间:O(N) 空间:O(N)