中兴模拟笔试题:字符串数组首尾字符相同

本文解析了一道中兴模拟笔试题,要求实现一个函数canArrangeWords,该函数接收一个单词数组,尝试按特定规则排列这些单词,即每个单词的首字母必须与前一个单词的尾字母相同。通过全排列算法并加入flag标志来提前终止搜索,一旦找到符合条件的序列即停止。代码使用C++实现,展示了如何通过交换元素位置进行全排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


做中兴模拟笔试的时候遇到的题目。
题目描述
将一个字符串数组中的字母按照以下规则排列:表中任何单词的首字母与其前面单词的尾字母相同! 函数canArrangeWords的输入应该包含一个整数num(1<=num<=100)和一个单词阵列arr,阵列元素是由所有小写字母组成的单词。单词长度为2-100之间,可取到2和100。能排列成功,返回1,不成功返回-1;
#思路
这个很像之前说的字符串全排列,用字符串全排列的方法也确实可以做出来,不过加了个flag进去,这样一旦找到一个符合条件的序列,就不继续寻找了。
#code
    

    #include <cstring>
    #include <iostream>
    using namespace std;
    int flag = 0;
    void quanpailie1(char **arr, int n, int k) {
        if (k == n) {  
            //不需要看输出结果就可以将下面的注释掉
            for (int i = 0; i < n; ++i)
              cout << arr[i] << '\t';
            cout << endl;
            flag = 1;
            return;  
        }     
        for (int i = k; i < n; ++i) {  
            if (flag==0&&k > 0 && (arr[k-1][strlen(arr[k-1])-1] == arr[i][0])) {  //k!=0,之前的0-k-1个字符串已经排好序,则判断k-1号字符串与之后的字符串,找到能够满足条件的i,将其和k的位置互换,flag如果等于1,代表已经找到了,不用找了,不然会找到所有满足条件的排列为止。
                swap(arr[k],arr[i]);  
                quanpailie1(arr, n, k+1);  
                swap(arr[k],arr[i]);  
            }
            else if ( k==0 ) {  
            //当k=0,前方无元素,所以将第一个元素挨个和后面的元素换一次,因为不确定成功的答案在哪个开头的数组里。
                swap(arr[k],arr[i]);  
                quanpailie1(arr, n, k+1);  
                swap(arr[k],arr[i]);  
            }  
            else
                continue;
        } 
        return; 
    }  
    int main() {
        int n;
        cin >> n;//输入几个字符串
        char **arr = new char*[n];
        for (int i = 0; i < n; ++i) {
            arr[i] = new char[100];
            memset(arr[i], 0, 100);
            cin >> arr[i];
        }
        quanpailie1(arr, n, 0);
        system("pause");
        if (flag)
            return true;
        else
            return false;
        
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值