Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับจำนวนตัวหารร่วมของสตริงที่กำหนดใน C++


ให้ numo และ demo สองสตริงเป็นอินพุต เป้าหมายคือการหาจำนวนตัวหารร่วมของทั้งสองสตริง ตัวหารของสตริงถูกพบโดยใช้เทคนิคต่อไปนี้:หากสตริง str มี sub1 เป็นตัวหาร เราก็สามารถสร้าง str โดยใช้ sub1 ได้โดยการทำซ้ำหลายๆ ครั้งจนกว่า str จะถูกสร้างขึ้น ตัวอย่าง:str=abcabcbc sub1=abc

ตัวอย่าง

อินพุต

numo = "abababab" demo = "abababababababab"

ผลลัพธ์

Count of number of common divisors of the given strings are: 2

คำอธิบาย

The strings can be generated using following divisor substrings :
“ab”, “abab”

อินพุต

numo = "pqqppqqp" demo = "pqpq"

ผลลัพธ์

Count of number of common divisors of the given strings are: 0

คำอธิบาย

The strings do not have any common divisor. Only divisors of both are:
“pqqp” for numo and “pq” for demo.

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

สำหรับสตริงย่อย 1 ใดๆ ที่จะเป็นตัวหารของ str ต้องเป็นคำนำหน้าของ str และความยาวต้องหารความยาวของ str ทั้งหมด ตรวจสอบเงื่อนไขของ sub1 นี้ด้วยทั้งสตริง numo และ demo และนับจำนวนที่เพิ่มขึ้นตามลำดับ

  • รับสตริง numo และ demo เป็นอินพุต

  • ตรวจสอบฟังก์ชัน (สตริง str, int val) รับสตริง str และคืนค่า 1 หากสตริงย่อยระหว่าง 0 ถึง val สามารถทำซ้ำได้เพื่อสร้าง str

  • ฟังก์ชัน common_divisor(หมายเลขสตริง การสาธิตสตริง) รับทั้งสตริงและส่งคืนการนับจำนวนตัวหารร่วมของสตริงที่กำหนด

  • นับเริ่มต้นเป็น 0

  • คำนวณความยาวของสตริงอินพุต และเก็บความยาวขั้นต่ำเป็น min_val

  • สำรวจโดยใช้ for loop จาก index i=0 ถึง min_val.

  • หากความยาวปัจจุบัน i ของสตริงย่อยแบ่งความยาวของทั้งสองสตริง numo_size และdemo_size และคำนำหน้าก็ตรงกับ numo.substr(0, i) ==demo.substr(0, i)

  • จากนั้นค้นหาว่าสตริงย่อย 0 ถึง i เป็นตัวหารของทั้ง numo และ demo โดยใช้ Verify()

  • หากทั้ง Verify(numo,i) และ Verify(demo,i) คืนค่า 1 ให้นับจำนวนที่เพิ่มขึ้น

  • ที่ส่วนท้ายของ for loop จะคืนค่าเป็นผลลัพธ์

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
int verify(string str, int val){
   int length = str.length();
   for (int i = 0; i < length; i++){
      if(str[i] != str[i % val]){
         return 0;
      }
   }
   return 1;
}
int common_divisor(string numo, string demo){
   int count = 0;
   int numo_size = numo.size();
   int demo_size = demo.size();
   int min_val = min(numo_size, demo_size);
   for(int i = 1; i <= min_val; i++){
      if(numo_size % i == 0){
         if(demo_size % i == 0){
            if(numo.substr(0, i) == demo.substr(0, i)){
               if(verify(numo, i)==1){
                  if(verify(demo, i)==1){
                     count++;
                  }
               }
            }
         }
      }
   }
   return count;
}
int main(){
   string numo = "abababab";
   string demo = "abababababababab";
   cout<<"Count the number of common divisors of the given strings are:
   "<<common_divisor(numo, demo);
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

Count the number of common divisors of the given strings are: 3