面试题 17.05. 字母与数字

发布时间 2023-04-08 22:58:26作者: lxy_cn

题目链接:面试题 17.05. 字母与数字

方法:TwoSum

解题思路

(1)将字符量化为 \(+1\),数字量化为 \(-1\),那么当子数组的和\(subSum = 0\)时,表示子数组中的字符和数字的数量相等;
(2)\(subSum = s[j] - s[i],j >= i,i = 1, 2, ...\)\(s[i]\)表示前\(i\)个元素的和;
(3)即找\(s[j] - s[i] = 0\),也即\(s[j] = s[i]\),且 \((j - i)\) \(is\) \(max\)

代码

class Solution {
public:
    vector<string> findLongestSubarray(vector<string>& array) {
        int n = array.size();
        int s = 0, mx_len = 0, l = 0;
        unordered_map<int, int> idx{{s, 0}};
        for (int i = 1; i <= n; i ++ ) {
            s += (array[i - 1][0] >> 6 & 1) * 2 - 1; // 字符 +1,数字 -1

            if (idx.count(s)) {
                int curlen = i - idx[s];
                if (curlen > mx_len) {
                    mx_len = curlen;
                    l = idx[s];
                }
            } else {
                idx[s] = i;
            }
        }
        
        return {array.begin() + l, array.begin() + l + mx_len};
    }
};
/*
关于array[i - 1][0] >> 6 & 1操作:
对于字母的ASCII码为 01xx xxxx,而数字的ASCII码为 0011 xxxx;
1、当字母执行上述操作后,结果为 1
2、当数字执行上述操作后,结果为 0
*/

复杂度分析

时间复杂度:\(O(n)\)
空间复杂度:\(O(n)\)

相关题目

1. 两数之和
1590. 使数组和能被 P 整除—题解:1590. 使数组和能被 P 整除(TwoSum !!!)