找不同(给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。)

给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。

示例:
输入:
s = "abcd"
t = "abcde"
输出:
e
解释:
'e' 是那个被添加的字母。

 字符串 t 比字符串 s 长度多 1 。先把t的首位字符赋值给c。 然后以字符  s 的长度遍历,s的第i位对应的 t应该是i+1位,用c依次异或,最终c里面存的字符就是添加的

public class lianxi{
	public static void main(String[] args){
		Solution S = new Solution();
		String s = "abcd";
		String t = "abcde";
		char c = S.findTheDifference(s, t);;
		System.out.println(c);
	}
}

class Solution {
    public char findTheDifference(String s, String t) {
        char[] char1 = s.toCharArray();
        char[] char2 = t.toCharArray();
        char c =char2[0];
        for(int i=0;i<char1.length;i++)
        {
           //将s 和 j中的字符依次异或 ,最终c里面存的就是添加的
            c^=char1[i];  
            c^=char2[i+1];
        }
        return c;
    }
}

 

在C语言中,两个字符串ST之间的不同之处,特别是T是由S随机重排添加一个新字符的情况,可以按照以下步骤进行: 1. **比较字符串长度**:首先,检查字符串T的长度是否比S长1,如果长度差不等于1,说明没有添加新的字符。 2. **创建哈希表(或计数数组)**:遍历字符串S,统计每个字符出现的次数,并存储在一个哈希表(如大小为26的数组,因为只有小写字母)中。 3. **遍历并更新哈希表**:再次遍历字符串T,对于每个字符,如果它也在哈希表中,就减少其对应的计数;如果不在,那它就是我们想要到的新字符。 4. **找出差异**:最后,在哈希表中查那些值为0的元素,它们代表的是在T中新增加的字符。 5. **返回结果**:返回第一个遇到的非零计数值所对应的字符作为结果,因为新添加的字符只能是一个。 ```c #include <stdio.h> #include <string.h> char findInsertedChar(char* S, char* T) { int hash[26] = {0}; for (int i = 0; S[i]; i++) { hash[S[i] - 'a']++; } for (int i = 0; T[i]; i++) { if (hash[T[i] - 'a'] > 0) { hash[T[i] - 'a']--; } else { return T[i]; } } // 如果没有提前返回,说明T比S多一个字符,但遍历完还没到,那就是最后一个字符 return T[strlen(T) - 1]; } int main() { char str1[] = "abcde"; char str2[] = "edcba"; // 例如,这里可能是str1的一个随机排列加上一个新字符 char insertedChar = findInsertedChar(str1, str2); printf("The inserted character is: %c\n", insertedChar); return 0; } ```
### 找出字符串 t 中相对于字符串 s 被添加字母 为了字符串 `t` 中相对于字符串 `s` 被添加字母,可以采用多种方法来解决这个问题。以下是基于哈希表字符计数的方法实现。 #### 方法一:利用字典统计字符频率 可以通过构建一个字典来记录字符串 `s` `t` 的字符频率差异,从而找出添加的字符。 ```python def find_added_char(s, t): char_count = {} # 统计字符串 t 中每个字符的数量 for char in t: if char in char_count: char_count[char] += 1 else: char_count[char] = 1 # 减去字符串 s 中对应字符的数量 for char in s: if char in char_count: char_count[char] -= 1 else: char_count[char] = -1 # 查剩余数量大于0的字符即为被添加的字符 added_char = [char for char, count in char_count.items() if count > 0] return ''.join(added_char) # 测试用例 s = "abcd" t = "abcde" print(find_added_char(s, t)) # 输出 e ``` 此方法的时间复杂度主要取决于遍历两个字符串的操作,因此其时间复杂度为 O(n+m)[^5],其中 n 是字符串 `s` 的长度,m 是字符串 `t` 的长度。 --- #### 方法二:异或运算求解 如果只存在单个字符被添加字符串 `t` 中,则可以使用位运算中的异或操作快速定位该字符。这种方法适用于仅有一个额外字符的情况。 ```python def find_single_added_char(s, t): result = 0 for char in s + t: # 合并两字符串逐一计算异或值 result ^= ord(char) return chr(result) # 测试用例 s = "abcd" t = "abcde" print(find_single_added_char(s, t)) # 输出 e ``` 上述代码的核心在于异或运算的特点——相同数值相消,不同保留特性[^6]。最终剩下的结果即是唯一不同的那个字符对应的 ASCII 值。 --- #### 总结 两种方法各有优劣: - **字典法**适合处理多个新增字符的情形; - **异或法**则更简洁高效,但前提是只有一个新加入的字符。 以上两种方式均能够有效解决问题,并且具有较高的效率与可扩展性。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值