将所有至少有 K 个字符的单词的第一个字符大写
在英语中,写句子时我们需要以大写字母开头,对于城市/人名等,我们以大写字母开头。在这个问题中,我们给出了一个字符串和一个数字,如果给定字符串的所有单词的大小不小于 k,我们必须更新它们的第一个字符。此外,如果单词的大小大于 k,并且它们的第一个字符已经大写,那么我们将保持原样。
示例
输入
string str = "这是要更改的给定字符串" int k = 5
输出
这是要更改的给定字符串
输入
string str = "thisisthegivenstring" int k = 8
输出
"Thisisthegivenstring"
简单方法
在此方法,我们将遍历字符串并找到空格字符,因为在每个空格字符处,我们都会找到新单词。
首先,我们将创建一个指向单词第一个字符的指针,还有另一个指针遍历字符串,直到没有检测到空格或字符串结尾。
我们将使用 toupper() 函数将字符串的第一个字符大写。如果第一个字符已经大写,则它将保持不变,否则将被更改。
此外,可能存在两个连续空格的情况,为此我们将检查两个指针是否位于同一位置,然后无需更改任何内容并移动到下一个字符。
示例
#include <bits/stdc++.h> using namespace std; // 创建一个函数来更改给定的字符串 string changeString(string str, int k){ int len = str.length(); // 存储给定字符串的大小 int ptr = 0; // 指向第一个字符的指针 for(int i=0; i<len; i++){ if(str[i] == ' '){ // 如果指针和当前指针位于同一位置,则为双空格字符或字符串开头的空格 if(i != ptr && i-ptr >= k){ str[ptr] = toupper(str[ptr]); } ptr = i+1; } } // 最后一个词的条件 if(ptr != len){ str[ptr] = toupper(str[ptr]); } return str; } int main(){ string str = "this is the given string To change"; // 给定字符串 int k = 5; // 给定数字 // 调用函数 cout<<changeString(str, k)<<endl; return 0; }
输出
this is the Given String To Change
时间和空间复杂度
上述代码的时间复杂度为 O(N),其中 N 是给定字符串的长度。
上述代码的空间复杂度为 O(1),因为我们在这里没有使用任何额外的空间并更改了给定的字符串。
使用 C++ 的 StringStream 类
StringStream 是在 C++ 编程语言中定义的类,用于将字符串处理为字符流。我们可以使用字符"<<"以流的形式获取单词,每次都会出现一个单词并将其存储在字符串变量中。
在这个程序中,我们使用了相同的概念,并创建了一个 stringstream 变量来存储给定的字符串,然后创建了一个字符串变量来从字符串中获取单词,并创建了另一个变量来存储答案。
我们使用 while 循环在流上使用"<<"提取运算符来获取单词的序列,并且如果需要,我们将每个单词的第一个字符大写。
此外,我们将每个单词存储在字符串中,我们需要在每个单词后添加额外的空格并返回该答案。
示例
#include <bits/stdc++.h> using namespace std; // 创建一个函数来更改给定的字符串 string changeString(string str, int k){ stringstream s(str); //创建 stringstream 变量 string ans = ""; // 用于存储答案的字符串 string cur_word; // 用于从字符串流中获取单词的字符串 while( s >> cur_word){ // 如果该单词的长度小于 k,则继续,否则根据需要更新第一个字符的值 if(cur_word.length() < k){ ans += cur_word; } else{ cur_word[0] = toupper(cur_word[0]); ans += cur_word; } // 每个单词后添加空格 ans += " "; } ans.pop_back(); // 删除最后添加的空格 return ans; //返回最终的字符串。 } int main(){ string str = "this is the given string To change"; // 给定字符串 int k = 5; // 给定数字 // 调用函数 cout<<changeString(str, k)<<endl; return 0; }
输出
this is the Given String To Change
时间和空间复杂度
上述代码的时间复杂度为 O(N),其中 N 是给定字符串的长度。
上述代码的空间复杂度为 O(N),因为我们在这里使用了一个额外的空间,即一个字符串来存储流和答案。
结论
在本教程中,我们实现了一个程序,如果给定字符串的长度大于给定的数字,则将其每个单词大写。我们实现了两种方法;一种方法是使用 toupper() C++ 函数将每个单词的第一个字符大写,然后使用两个指针简单地遍历字符串。在第二种方法中,我们使用 stringstreamc++ 库来获取每个单词。