鱼C论坛

 找回密码
 立即注册
查看: 1549|回复: 2

[已解决]求公共前缀

[复制链接]
发表于 2019-8-22 23:28:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5. /*编写一个函数来查找字符串数组中的最长公共前缀。

  6. 如果不存在公共前缀,返回空字符串 ""*/
  7. string longestCommonPrefix(vector<string> &strs)
  8. {
  9.     string result;

  10.     /*判定向量是否为空*/
  11.     if (strs.empty())
  12.     {
  13.         result = {""};
  14.     }
  15.     else
  16.     {
  17.         if (strs.size() < 3)
  18.         {
  19.             /*构造三个向量元素,跳过对向量长度小于3时的判定*/
  20.             string temp = strs[0] + "o0";
  21.             string temp1 = strs[0] + "1o0";
  22.             string temp2 = strs[0] + "2o0";
  23.             strs.push_back(temp);
  24.             strs.push_back(temp1);
  25.             strs.push_back(temp2);
  26.             size_t j = 0, s = strs.size();
  27.             for (size_t i = 0; i < s / 2; i++)
  28.             {
  29.                 for (;; j++)
  30.                 {
  31.                     if (strs[i][j] != strs[s - 1 - i][j])
  32.                     {
  33.                         break;
  34.                     }
  35.                     result.push_back(strs[0][j]);
  36.                 }
  37.             }
  38.         }
  39.         else
  40.         {
  41.             /*在首位和次位向量元素追加任意不同的字符,跳过对多个空字符串的判定*/
  42.             strs[0].push_back('o');
  43.             strs[1].push_back('z');
  44.             size_t j = 0, s = strs.size();
  45.             for (size_t i = 0; i < s / 2; i++)
  46.             {
  47.                 for (;; j++)
  48.                 {
  49.                     if (strs[i][j] != strs[s - 1 - i][j])
  50.                     {
  51.                         break;
  52.                     }
  53.                     result.push_back(strs[0][j]);
  54.                 }
  55.             }
  56.         }
  57.     }
  58.     string &res = result;
  59.     return res;
  60. }
  61. int main(int argc, char const *argv[])
  62. {
  63.     vector<string> a = {"flower", "floor", "flight"};
  64.     vector<string> b = {"c", "c", "c"};
  65.     vector<string> c = {"flower"};
  66.     vector<string> d = {"",""};
  67.     vector<string> e = {
  68.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  69.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  70.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  71.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  72.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  73.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  74.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  75.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  76.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  77.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  78.     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  79. };
  80.     cout << longestCommonPrefix(a) << endl;
  81.     cout << longestCommonPrefix(b) << endl;
  82.     cout << longestCommonPrefix(c) << endl;
  83.     cout << longestCommonPrefix(d) << endl;
  84.     cout << longestCommonPrefix(e) << endl;
  85.     return 0;
  86. }
复制代码

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.16299.1087]
(c) 2017 Microsoft Corporation。保留所有权利。

E:\Users\86184\Documents\Code>c:\Users\86184\.vscode\extensions\ms-vscode.cpptools-0.25.0\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-5lylunsz.ufb --stdout=Microsoft-MIEngine-Out-dkysla5w.cuu --stderr=Microsoft-MIEngine-Error-a54rus54.jdx --pid=Microsoft-MIEngine-Pid-qmnfxem5.bad "--dbgExe=E:\My Program\MinGW\bin\gdb.exe" --interpreter=mi
fl
c
flower

瓠?瓠贺?═   floorz ?瓠?瓠吼?═   flight ?瓠?瓠韩?        ?艭:   ???铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪?婩: ╗   ?  ╔    粒冢
                           ((((((((((((((((((((

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
为什么字符串e会输出乱码,应该怎么判定?
求解?
最佳答案
2019-8-23 16:12:32
用 Visual studio 运行,不会乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-23 16:12:32 | 显示全部楼层    本楼为最佳答案   
用 Visual studio 运行,不会乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-24 01:47:17 | 显示全部楼层
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include<algorithm>
  5. using namespace std;
  6. /*编写一个函数来查找字符串数组中的最长公共前缀。

  7. 如果不存在公共前缀,返回空字符串 ""*/
  8. string longestCommonPrefix(vector<string> &strs)
  9. {
  10.         string result;
  11.         /*判定向量是否为空*/
  12.         if (strs.empty())
  13.         {
  14.                 result = {""};
  15.         }
  16.         else
  17.         {
  18.                 size_t s = strs.size();
  19.                 if (s == 1)
  20.                 {
  21.                         return strs[0];
  22.                 }
  23.                 else if (s > 1)
  24.                 {
  25.                         /*构造向量字符串元素跳过对{"c", "c",...}和{"","",....}类似的向量元素的判定*/
  26.                         strs[0] = strs[0] + "10lo";
  27.                         strs[1] = strs[1] + "l01o";
  28.                         /*初始化计数器*/
  29.                         size_t count = 0;
  30.                         /*定义数组,保存对比的计数结果*/
  31.                         vector<int> arr;
  32.                         for (size_t i = s - 1; i > 0; i--)
  33.                         {
  34.                                 for (size_t j = 0;; j++)
  35.                                 {
  36.                                         if (strs[0][j] != strs[i][j])
  37.                                         {
  38.                                                 break;
  39.                                         }
  40.                                         count++;
  41.                                 }
  42.                                 arr.push_back(count);
  43.                                 /*重新初始化计数器*/
  44.                                 count = 0;
  45.                         }
  46.                         size_t sa = arr.size();
  47.                         /*从小到大排序*/
  48.                         sort(arr.begin(), arr.end());               
  49.                         /*首位元素就是最终结果*/
  50.                         if (arr[0] == 0)
  51.                         {
  52.                                 result = {""};
  53.                         }
  54.                         else
  55.                         {
  56.                                 for (size_t i = 0; i < arr[0]; i++)
  57.                                 {
  58.                                         result.push_back(strs[1][i]);
  59.                                 }
  60.                         }
  61.                 }
  62.         }
  63.         return result;
  64. }
  65. int main(int argc, char const *argv[])
  66. {
  67.         vector<string> a = {"boot", "boom", "boor", "boall"};
  68.         vector<string> b = {"baac", "bacc", "b"};
  69.         vector<string> c = {"flower"};
  70.         vector<string> d = {"",""};
  71.         vector<string> e =
  72.                 {
  73.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  74.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  75.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  76.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  77.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  78.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  79.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  80.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  81.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  82.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  83.                         "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  84.                 };
  85.         cout << longestCommonPrefix(a) << endl;
  86.         cout << longestCommonPrefix(b) << endl;
  87.         cout << longestCommonPrefix(c) << endl;
  88.         cout << longestCommonPrefix(d) << endl;
  89.         cout << longestCommonPrefix(e) << endl;
  90.         return 0;
  91. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-2 12:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表