列表

详情


1542. 找出最长的超赞子字符串

给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。

「超赞子字符串」需满足满足下述两个条件:

 

示例 1:

输入:s = "3242415"
输出:5
解释:"24241" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "24142"

示例 2:

输入:s = "12345678"
输出:1

示例 3:

输入:s = "213123"
输出:6
解释:"213123" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "231132"

示例 4:

输入:s = "00"
输出:2

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int longestAwesome(string s) { } };

rust 解法, 执行用时: 5 ms, 内存消耗: 2.2 MB, 提交时间: 2024-05-20 09:06:28

impl Solution {
    pub fn longest_awesome(s: String) -> i32 {
        const D: usize = 10;
        let n = s.len() as i32;
        let mut pos = vec![n; 1 << D]; // n 表示没有找到异或前缀和
        pos[0] = -1; // pre[-1] = 0
        let mut ans = 0;
        let mut pre = 0;
        for (i, c) in s.bytes().enumerate() {
            let i = i as i32;
            pre ^= 1 << (c - b'0');
            for d in 0..D {
                ans = ans.max(i - pos[pre ^ (1 << d)]); // 奇数
            }
            ans = ans.max(i - pos[pre]); // 偶数
            if pos[pre] == n { // 首次遇到值为 pre 的前缀异或和,记录其下标 i
                pos[pre] = i;
            }
        }
        ans
    }
}

javascript 解法, 执行用时: 63 ms, 内存消耗: 51.5 MB, 提交时间: 2024-05-20 09:06:14

/**
 * @param {string} s
 * @return {number}
 */
var longestAwesome = function(s) {
    const D = 10; // s 中的字符种类数
    const n = s.length;
    const pos = Array(1 << D).fill(n); // n 表示没有找到异或前缀和
    pos[0] = -1; // pre[-1] = 0
    let ans = 0;
    let pre = 0;
    for (let i = 0; i < n; i++) {
        pre ^= 1 << (s.charCodeAt(i) - '0'.charCodeAt(0));
        for (let d = 0; d < D; d++) {
            ans = Math.max(ans, i - pos[pre ^ (1 << d)]); // 奇数
        }
        ans = Math.max(ans, i - pos[pre]); // 偶数
        if (pos[pre] === n) { // 首次遇到值为 pre 的前缀异或和,记录其下标 i
            pos[pre] = i;
        }
    }
    return ans;
};

golang 解法, 执行用时: 7 ms, 内存消耗: 4 MB, 提交时间: 2024-05-20 09:06:02

func longestAwesome(s string) (ans int) {
    const D = 10 // s 中的字符种类数
    n := len(s)
    pos := [1 << D]int{}
    for i := range pos {
        pos[i] = n // n 表示没有找到异或前缀和
    }
    pos[0] = -1 // pre[-1] = 0
    pre := 0
    for i, c := range s {
        pre ^= 1 << (c - '0')
        for d := 0; d < D; d++ {
            ans = max(ans, i-pos[pre^(1<<d)]) // 奇数
        }
        ans = max(ans, i-pos[pre]) // 偶数
        if pos[pre] == n { // 首次遇到值为 pre 的前缀异或和,记录其下标 i
            pos[pre] = i
        }
    }
    return
}

cpp 解法, 执行用时: 21 ms, 内存消耗: 11 MB, 提交时间: 2024-05-20 09:05:48

class Solution {
    const int D = 10; // s 中的字符种类数
public:
    int longestAwesome(string s) {
        int n = s.size();
        vector<int> pos(1 << D, n); // n 表示没有找到异或前缀和
        pos[0] = -1; // pre[-1] = 0
        int ans = 0, pre = 0;
        for (int i = 0; i < n; i++) {
            pre ^= 1 << (s[i] - '0');
            for (int d = 0; d < D; d++) {
                ans = max(ans, i - pos[pre ^ (1 << d)]); // 奇数
            }
            ans = max(ans, i - pos[pre]); // 偶数
            if (pos[pre] == n) { // 首次遇到值为 pre 的前缀异或和,记录其下标 i
                pos[pre] = i;
            }
        }
        return ans;
    }
};

python3 解法, 执行用时: 1376 ms, 内存消耗: 16.6 MB, 提交时间: 2023-06-08 09:46:35

class Solution:
    def longestAwesome(self, s: str) -> int:
        # 回文字符串的条件
        # 1)每个字符均有偶数个
        # 2)仅存在一个字符为奇数个
        # 字符个数奇偶性压缩
        # 记录当前状态下的最小索引值
        hashmap = {0:-1}
        n = len(s)
        ans = 1
        # 初始状态
        init = 0
        for i in range(n):
            init ^= 1 << int(s[i])
            # 判断全为偶数个
            if init in hashmap:
                ans = max(ans,i - hashmap[init])
            else:
                hashmap[init] = i
            # 枚举所有仅存在一个字符为奇数个的状态
            for j in range(10):
                if init ^ (1 << j) in hashmap:
                    ans = max(ans,i - hashmap[init ^ (1 << j)])
        return ans

python3 解法, 执行用时: 1180 ms, 内存消耗: 16.4 MB, 提交时间: 2023-06-08 09:45:43

class Solution:
    def longestAwesome(self, s: str) -> int:
        n = len(s)
        prefix = {0: -1}
        ans, sequence = 0, 0

        for j in range(n):
            digit = ord(s[j]) - ord("0")
            sequence ^= (1 << digit)
            if sequence in prefix:
                ans = max(ans, j - prefix[sequence])
            else:
                prefix[sequence] = j
            for k in range(10):
                if sequence ^ (1 << k) in prefix:
                    ans = max(ans, j - prefix[sequence ^ (1 << k)])
        
        return ans

java 解法, 执行用时: 10 ms, 内存消耗: 42.6 MB, 提交时间: 2023-06-08 09:43:04

/**
 * 状态压缩
 **/
class Solution {
    static int[] pre = new int[1 << 11];
    public int longestAwesome(String s) {
        int n = s.length(), status = 0, res = 0;
        Arrays.fill(pre, -2);  // pre数组初始化为-2,代表都没有出现过
        pre[status] = -1;  // 最初的状态为0,代表都出现了0次(偶数次)
        for (int i = 0; i < n; i++) {
            status ^= 1 << (s.charAt(i) - '0');  // 更新当前状态
            if (pre[status] != -2) {  // 之前已经存在过
                res = Math.max(res, i - pre[status]);
            } else {  // 没有存在过
                pre[status] = i;
            }
            for (int j = 0; j < 10; j++) {  // 枚举0-9
                int status1 = status ^ (1 << j);  // 将对应位置的奇偶性改变
                if (pre[status1] != -2) {  // 之前是否出现过
                    res = Math.max(res, i - pre[status1]);
                }
            }
        }
        return res;
    }
}

java 解法, 执行用时: 100 ms, 内存消耗: 43 MB, 提交时间: 2023-06-08 09:42:13

/**
 * 前缀和+状态压缩
 * 
 **/
class Solution {
    public int longestAwesome(String s) {
        HashMap<Integer,Integer> map=new HashMap<>();
        int cur=0;  //状态
        int ans=1;  //记录答案
        map.put(cur,-1); 
        for(int c=0;c<s.length();c++){
            int ch=s.charAt(c)-'0';
            //计数
            cur=cur^(1<<ch);
            //一个数字出现奇数次,其余出现偶数次
            for(int i=0;i<10;i++){
                int next=cur^(1<<i);
                if(map.containsKey(next)){
                    ans=Math.max(ans,c-map.get(next));
                }
            }
            //所有都出现了偶数次
            if(!map.containsKey(cur)){
                map.put(cur,c);
            }else{
                ans=Math.max(ans,c-map.get(cur));
            }
        }
        return ans;
    }
}

上一题