将所有至少有 K 个字符的单词的第一个字符大写

data structurec++programming更新于 2024/10/17 0:24:00

在英语中,写句子时我们需要以大写字母开头,对于城市/人名等,我们以大写字母开头。在这个问题中,我们给出了一个字符串和一个数字,如果给定字符串的所有单词的大小不小于 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++ 库来获取每个单词。


相关文章