Java中连续赋值表达式的含义及同构字符串无Map解法疑问
同构字符串无Map解法连续赋值语句解释
前置设计说明
要理解这行代码的作用,首先要搞清楚解法的底层存储设计:
- 长度为512的int数组
m默认初始值全为0,被拆分为两个独立的存储区间:- 前256位(下标0~255):存储第一个字符串
s1中每个ASCII字符最近一次被访问的标记值 - 后256位(下标256~511):存储第二个字符串
s2中每个ASCII字符最近一次被访问的标记值,通过s2.charAt(i)+256的偏移量实现寻址
- 前256位(下标0~255):存储第一个字符串
- 标记值采用
i+1而非遍历下标i的原因:避免和数组初始值0混淆,明确区分「从未被访问过的字符」和「在第0位被访问的字符」
连续赋值语句作用解释
你疑问的m[s1.charAt(i)] = m[s2.charAt(i)+256] = i+1;是Java的右结合连续赋值语法,执行顺序从右到左:
- 先把当前遍历位置+1的标记值
i+1赋值给s2当前字符对应的后256位存储位置 - 再把同样的
i+1赋值给s1当前字符对应的前256位存储位置
这个操作的核心作用是给当前互相映射的一对字符打上相同的时间戳标记,实现两个核心效果:
- 双向绑定映射关系:只要两个字符是合法的同构映射对,二者对应的存储值永远保持一致
- 记录访问顺序:后续遍历遇到相同字符时,可通过存储值是否匹配直接判断映射是否合法
逻辑验证
这套设计天然覆盖了同构字符串的所有规则:
- 相同字符必须映射到同一个字符:如果
s1中重复出现字符a,对应位置的s2如果不是之前绑定的字符b,二者的存储时间戳会不一致,直接触发return false - 不同字符不能映射到同一个字符:如果
s2中重复出现字符b,对应位置的s1如果不是之前绑定的字符a,二者的存储时间戳同样会不一致,直接拦截多对一的非法映射
以示例2 s="foo", t="bar"为例:
- i=0:
m['f']和m['b'+256]初始都是0,判断相等,赋值后二者都为1 - i=1:
m['o']和m['a'+256]初始都是0,判断相等,赋值后二者都为2 - i=2:
m['o']存储值为2,m['r'+256]存储值为0,二者不相等直接返回false,符合预期
内容的提问来源于stack exchange,提问作者Saurav Shrivastav
相关产品推荐
相关产品推荐

