列表

详情


100291. 统计特殊字母的数量 II

给你一个字符串 word。如果 word 中同时出现某个字母 c 的小写形式和大写形式,并且 每个 小写形式的 c 都出现在第一个大写形式的 c 之前,则称字母 c 是一个 特殊字母

返回 word特殊字母 的数量。

 

示例 1:

输入:word = "aaAbcBC"

输出:3

解释:

特殊字母是 'a''b''c'

示例 2:

输入:word = "abc"

输出:0

解释:

word 中不存在特殊字母。

示例 3:

输入:word = "AbBCab"

输出:0

解释:

word 中不存在特殊字母。

 

提示:

原站题解

去查看

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

golang 解法, 执行用时: 15 ms, 内存消耗: 6.8 MB, 提交时间: 2024-04-21 23:53:20

func numberOfSpecialChars(word string) int {
	var lower, upper, invalid uint
	for _, c := range word {
		bit := uint(1) << (c & 31)
		if c&32 > 0 { // 小写字母
			lower |= bit
			if upper&bit > 0 { // c 也在 upper 中
				invalid |= bit // 不合法
			}
		} else { // 大写字母
			upper |= bit
		}
	}
	// 从交集 lower & upper 中去掉不合法的字母 invalid
	return bits.OnesCount(lower & upper &^ invalid)
}

func numberOfSpecialChars2(word string) (ans int) {
	state := [27]int{}
	for _, c := range word {
		x := c & 31
		if c&32 > 0 {
			if state[x] == 0 {
				state[x] = 1
			} else if state[x] == 2 {
				state[x] = -1
				ans--
			}
		} else {
			if state[x] == 0 {
				state[x] = -1
			} else if state[x] == 1 {
				state[x] = 2
				ans++
			}
		}
	}
	return
}

java 解法, 执行用时: 9 ms, 内存消耗: 44.6 MB, 提交时间: 2024-04-21 23:52:55

class Solution {
    public int numberOfSpecialChars(String word) {
        int ans = 0;
        int[] state = new int[27];
        for (char c : word.toCharArray()) {
            int x = c & 31; // 转成数字 1~26
            if ((c & 32) > 0) { // 小写字母
                if (state[x] == 0) {
                    state[x] = 1;
                } else if (state[x] == 2) {
                    state[x] = -1;
                    ans--;
                }
            } else { // 大写字母
                if (state[x] == 0) {
                    state[x] = -1;
                } else if (state[x] == 1) {
                    state[x] = 2;
                    ans++;
                }
            }
        }
        return ans;
    }

    public int numberOfSpecialChars2(String word) {
        int lower = 0, upper = 0, invalid = 0;
        for (char c : word.toCharArray()) {
            int bit = 1 << (c & 31);
            if ((c & 32) > 0) { // 小写字母
                lower |= bit;
                if ((upper & bit) > 0) { // c 也在 upper 中
                    invalid |= bit; // 不合法
                }
            } else { // 大写字母
                upper |= bit;
            }
        }
        // 从交集 lower & upper 中去掉不合法的字母 invalid
        return Integer.bitCount(lower & upper & ~invalid);
    }
}

cpp 解法, 执行用时: 59 ms, 内存消耗: 22 MB, 提交时间: 2024-04-21 23:52:26

class Solution {
public:
    int numberOfSpecialChars(string word) {
        int lower = 0, upper = 0, invalid = 0;
        for (char c : word) {
            int bit = 1 << (c & 31);
            if (c & 32) { // 小写字母
                lower |= bit;
                if (upper & bit) { // c 也在 upper 中
                    invalid |= bit; // 不合法
                }
            } else { // 大写字母
                upper |= bit;
            }
        }
        // 从交集 lower & upper 中去掉不合法的字母 invalid
        return __builtin_popcount(lower & upper & ~invalid);
    }

    int numberOfSpecialChars2(string word) {
        int ans = 0;
        int state[27]{};
        for (char c : word) {
            int x = c & 31; // 转成数字 1~26
            if (c & 32) { // 小写字母
                if (state[x] == 0) {
                    state[x] = 1;
                } else if (state[x] == 2) {
                    state[x] = -1;
                    ans--;
                }
            } else { // 大写字母
                if (state[x] == 0) {
                    state[x] = -1;
                } else if (state[x] == 1) {
                    state[x] = 2;
                    ans++;
                }
            }
        }
        return ans;
    }
};

python3 解法, 执行用时: 199 ms, 内存消耗: 17.5 MB, 提交时间: 2024-04-21 23:52:00

class Solution:
    # 状态机
    def numberOfSpecialChars(self, word: str) -> int:
        ans = 0
        state = [0] * 27
        for c in map(ord, word):
            x = c & 31  # 转成数字 1~26
            if c & 32:  # 小写字母
                if state[x] == 0:
                    state[x] = 1
                elif state[x] == 2:
                    state[x] = -1
                    ans -= 1
            else:  # 大写字母
                if state[x] == 0:
                    state[x] = -1
                elif state[x] == 1:
                    state[x] = 2
                    ans += 1
        return ans
        
    # 位运算
    def numberOfSpecialChars2(self, word: str) -> int:
        lower = upper = invalid = 0
        for c in map(ord, word):
            bit = 1 << (c & 31)
            if c & 32:  # 小写字母
                lower |= bit
                if upper & bit:  # c 也在 upper 中
                    invalid |= bit  # 不合法
            else:  # 大写字母
                upper |= bit
        # 从交集 lower & upper 中去掉不合法的字母 invalid
        return (lower & upper & ~invalid).bit_count()

上一题