46题目描述:

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

解析:

1.将int变量num转换成字符串,定义dp数组,通过for循环填充dp数组
2. 在当前遍历的过程中,第i个字符为倒数第一个字符,第i-1为倒数第二个字符
3.第一个判断
如果发现第i-1的字符为1或者发现第i-1的字符为2并且第i个字符的值小于等于5,则进行下一步判断
否则如果最后两个数字组合在一起都无法翻译为字母,则dp[i] = dp[i - 1]
第二个判断
如果i等于1,则dp[i]等于2
否则说明遍历的字符串有三个数字了,并且最后两个数字可以翻译为字母,则dp[i] = dp[i - 1] + dp[i - 2]
4.最后返回dp[s.length() - 1]即可

Java:

public int translateNum(int num) {
        String s = String.valueOf(num);
        int[] dp = new int[s.length()];
        dp[0] = 1;
        for(int i = 1; i < s.length(); i++) {
            if(s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) <= '5')) {
                if(i == 1) {
                    dp[i] = 2;
                } else {
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
            } else {
                dp[i] = dp[i - 1];
            }
        }
        return dp[s.length() - 1];
    }

JavaScript:

var translateNum = function(num) {
    let s = num.toString();
    let dp = new Array(s.length + 1);
    dp[0] = 1;
    for(let i = 1; i < s.length; i++) {
        if(s[i - 1] === '1' || (s[i - 1] === '2' && s[i] <= '5')) {
            if(i === 1) {
                dp[i] = 2;
            } else {
                dp[i] = dp[i - 1] + dp[i - 2];
            }
        } else {
            dp[i] = dp[i - 1];
        }
    }
    return dp[s.length - 1];
};

48题目描述:

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

解析:

滑动窗口(sliding window)
1.创建一个set
2.两个指针
第一个指针j指向字符串的开头
第二个指针i随着for循环遍历字符串
3.如果set里没有[i],说明目前为止还没有重复的字符,把s[i]添加到set里,
然后更新最大不重复字符的数量。
4.如果set里有s[i],则从set里开始删除s[j],并且递增j,再检查set里是否有s[i],
如此反复直到set里没有s[i]为止。
5.重复步骤3和4,知道遍历完整个字符串。

Java:

public int lengthOfLongestSubstring(String s) {
        if(s == null || s.length() == 0) {
            return 0;
        }
        HashSet<Character> set = new HashSet<>();
        int j = 0, maxLength = 0;
        for(int i = 0; i < s.length(); i++) {
            if(!set.contains(s.charAt(i))) {
                set.add(s.charAt(i));
                maxLength = Math.max(maxLength, set.size());
            } else {
                while(set.contains(s.charAt(i))) {
                    set.remove(s.charAt(j));
                    j++;
                }
                set.add(s.charAt(i));
            }
        }
        return maxLength;
    }

JavaScript:

var lengthOfLongestSubstring = function(s) {
    if(s === null || s.length === 0) {
        return 0;
    }
    const set = new Set();
    let j = 0, maxLength = 0;
    for(let i = 0; i < s.length; i++) {
        if(!set.has(s[i])) {
            set.add(s[i]);
            maxLength = Math.max(maxLength, set.size);
        } else {
            while(set.has(s[i])) {
                set.delete(s[j]);
                j++;
            }
            set.add(s[i]);
        }
    }
    return maxLength;
};