用从c++写出代码:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
时间: 2023-12-03 16:46:14 浏览: 80
以下是用 c++ 实现的解决方案:
```c++
#include <iostream>
#include <unordered_map>
using namespace std;
int firstUniqChar(string s) {
unordered_map<char, int> charMap;
for (char c : s) {
charMap[c]++;
}
for (int i = 0; i < s.length(); i++) {
if (charMap[s[i]] == 1) {
return i;
}
}
return -1;
}
int main() {
string s = "leetcode";
int index = firstUniqChar(s);
cout << index << endl; // 输出 0
return 0;
}
```
此代码中,我们使用了一个哈希表来记录每个字符出现的次数。然后我们遍历一遍字符串,找到第一个出现次数为 1 的字符,返回其索引即可。如果遍历完整个字符串没有找到这样的字符,就返回 -1。
相关问题
写一个c++代码 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
下面是C++的实现代码:
```c++
#include <iostream>
#include <unordered_map>
using namespace std;
int firstUniqChar(string s) {
unordered_map<char, int> freq;
for (char c : s) {
freq[c]++;
}
for (int i = 0; i < s.size(); i++) {
if (freq[s[i]] == 1) {
return i;
}
}
return -1;
}
int main() {
string s = "leetcode";
int res = firstUniqChar(s);
cout << res << endl; // 输出 0
return 0;
}
```
该算法的时间复杂度是O(n),其中n是字符串的长度。首先,我们使用一个哈希表记录每个字符在字符串中出现的次数。然后,我们遍历字符串,找到第一个出现次数为1的字符,返回其索引。如果没有找到这样的字符,则返回-1。
用c++语言编程:给定一个字符串A和一个字符串B,找到B在A中的最小子串,它将包含B中的所有字符。
你可以使用滑动窗口算法来解决这个问题。下面是一个用C语言实现的示例代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_CHARS 256
// 判断两个字符数组是否相等
int isSame(int countP[], int countQ[]) {
for (int i = 0; i < MAX_CHARS; i++) {
if (countP[i] != countQ[i]) {
return 0;
}
}
return 1;
}
void findMinSubstring(char A[], char B[]) {
int lenA = strlen(A);
int lenB = strlen(B);
if (lenA < lenB) {
printf("No such window exists");
return;
}
// 统计B中每个字符出现的次数
int countB[MAX_CHARS] = {0};
for (int i = 0; i < lenB; i++) {
countB[B[i]]++;
}
// 统计A中每个字符出现的次数
int countA[MAX_CHARS] = {0};
int start = 0, startIndex = -1, minLength = INT_MAX;
int count = 0;
for (int j = 0; j < lenA; j++) {
// 统计A中每个字符出现的次数
countA[A[j]]++;
// 找到B中的所有字符
if (countB[A[j]] != 0 && countA[A[j]] <= countB[A[j]]) {
count++;
}
// 如果找到了B中的所有字符
if (count == lenB) {
// 移除多余的字符
while (countA[A[start]] > countB[A[start]] || countB[A[start]] == 0) {
if (countA[A[start]] > countB[A[start]]) {
countA[A[start]]--;
}
start++;
}
// 更新最小长度和起始索引
int windowLen = j - start + 1;
if (windowLen < minLength) {
minLength = windowLen;
startIndex = start;
}
}
}
// 没有找到符合条件的子串
if (startIndex == -1) {
printf("No such window exists");
return;
}
// 打印最小子串
for (int k = startIndex; k < startIndex + minLength; k++) {
printf("%c", A[k]);
}
}
int main() {
char A[] = "ADOBECODEBANC";
char B[] = "ABC";
findMinSubstring(A, B);
return 0;
}
```
这个示例代码中,我们通过滑动窗口算法来寻找在字符串A中包含字符串B的最小子串。我们使用两个字符数组`countA`和`countB`来分别统计字符串A和B中每个字符出现的次数。然后,我们使用两个指针`start`和`startIndex`来表示窗口的起始位置,以及一个变量`minLength`来记录当前找到的最小子串的长度。我们逐步向右移动指针,更新窗口内的字符计数,并在窗口内找到了所有B中的字符时进行处理。如果找到了比当前最小子串长度更小的子串,我们更新`minLength`和`startIndex`。最后,我们打印出最小子串。
对于给定的示例输入,上述代码将输出 "BANC",这是字符串A中包含字符串B的最小子串。
阅读全文