91. Decode Ways

本文深入探讨使用动态规划解决字符串解码问题,重点讲解0在解码中的特殊处理,通过实例解析逐步递增的解码方式,理解不同情况下解码路径的计算。

这道题想到了用dp做,其实最后还是在缝缝补补,不过现在思路清晰一点了,这道题的难点就是0的decode
思路:首先要想明白的是,开头是0或者有连续两个0,那么decode就会失败,即return 0,想明白这点剩下的就简单了,想到用dp做的原因是,我们把假设string 是121,想象成一个一个放入,一开始容器只有一个1,之后再放入2,那么ways的增加即是新放入的2与原来的way decode中单独存在的1成功构成编码的个数,在我们的假设中,能成功构成的编码有一个,即12
还是不懂?再详细举例一个 假设string 为2260
一开始容器为一个2 (1)
之后放入2,原来单独存在的2有一个,且22能够decode,所以22的ways为2(1+1)
再放入6,原来的decode way为两条:2|2 ;22
可以看到,单独存在的前一个只有一个(2|2)且6与2(26)能够decode,所以226的ways为(2+1)
再放入0,原来的decode way为3条:22|6;2|2|6;2|26
可以看到,单独存在的前一个有两个(22|6)和(2|2|6),但是0与6(60)不能够decode,所以增加的为0,但是0又不能单独存在,所以deocode失败(前面那些2啊6啊都能单独存在,所以他们可以把前面的dp结果当成基数)
代码挺乱的,我也挺懒的,仔细看应该看得懂吧,毕竟我感觉我已经把我能想到的都讲了。。

class Solution {
public:
	int dp[10000];
	int numDecodings(string s) {
		if (s[0] == '0')return 0;
		dp[0] = 1;
		int n = s.length() - 1;
		for (int i = 1; i <= n; ++i) {
			if ((s[i - 1] == '2'&&s[i] > '6')||(s[i-1]>'2'&&s[i]!='0'))dp[i] = dp[i - 1];
			else if (s[i] == '0') {
				if (s[i - 1] > '2'||s[i-1]=='0')return 0;
				int dc = i == 1 ? dp[i - 1] : dp[i - 2];
				dp[i] = dc;
			}
			else {
                if(s[i-1]=='0')dp[i]=dp[i-1];
				else {
                    int ic = i == 1 ? 1 : dp[i - 2];//increase
				    dp[i] = dp[i - 1] + ic;
                }
			}
		}
		return dp[n];
	}
};
你提到的 `count.decode` 可能是指在 Python 中对某种编码的数据进行解码操作,尤其是对字符串或字节数据使用 `.decode()` 方法。`.decode()` 是字节(`bytes`)对象的一个方法,用于将字节数据解码为字符串(`str`)。 --- ### ✅ 示例:使用 `.decode()` 将字节解码为字符串 #### 常见编码方式包括: - `'utf-8'` - `'utf-16'` - `'latin-1'` 或 `'iso-8859-1'` - `'ascii'` #### 示例代码: ```python # 原始字符串 original_str = "Hello, 世界" # 编码为 UTF-8 字节 encoded_bytes = original_str.encode('utf-8') # 解码为字符串 decoded_str = encoded_bytes.decode('utf-8') print("原始字符串:", original_str) print("解码后的字符串:", decoded_str) ``` 输出: ``` 原始字符串: Hello, 世界 解码后的字符串: Hello, 世界 ``` --- ### 🧠 `.decode()` 的常见用法 ```python bytes_data = b'Hello%2C+%E4%B8%96%E7%95%8C' # URL 编码的 bytes decoded_str = bytes_data.decode('utf-8') # 解码为字符串 print(decoded_str) # 输出: Hello%,+世界 ``` 如果你需要进一步解码 URL 编码的内容,可以结合 `urllib.parse.unquote()`: ```python from urllib.parse import unquote url_encoded_str = "Hello%2C+%E4%B8%96%E7%95%8C" decoded_url = unquote(url_encoded_str) print(decoded_url) # 输出: Hello, 世界 ``` --- ### ❗ 常见错误 #### 1. 编码不匹配导致的 `UnicodeDecodeError` ```python invalid_bytes = b'\xff\xfe\x0c\x00\x00\x00' # 使用错误的编码方式会抛出异常 invalid_bytes.decode('utf-8') # 可能抛出 UnicodeDecodeError ``` **解决办法:** ```python # 使用 errors 参数忽略错误或替换为无效字符 decoded_str = invalid_bytes.decode('utf-8', errors='ignore') print(decoded_str) ``` --- ### ✅ 示例:处理网络响应中的 `.decode()` 如果你从网络请求中获取了响应内容(如使用 `requests`),通常你会这样处理: ```python import requests response = requests.get('https://example.com') content = response.content # 获取的是 bytes 类型 text = content.decode('utf-8') # 解码为字符串 print(text[:100]) # 打印前100个字符 ``` --- ### ✅ 示例:使用 `.decode()` 处理压缩数据(如 gzip) ```python import gzip # 假设 data 是 gzip 压缩过的字节数据 with gzip.open('example.txt.gz', 'rb') as f: content_bytes = f.read() content_str = content_bytes.decode('utf-8') print(content_str) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值