স্ট্রিং পুরোপুরি একই স্ট্রিংয়ের তৈরি কিনা তা আমি কীভাবে পরীক্ষা করব?


128

আমাকে একটি ফাংশন তৈরি করতে হবে যা একটি স্ট্রিং নেয় এবং এটি ফিরে আসবে trueবা falseইনপুটটিতে পুনরাবৃত্ত অক্ষর ক্রম থাকে কিনা তার উপর ভিত্তি করে। প্রদত্ত স্ট্রিংয়ের দৈর্ঘ্য সর্বদা এর চেয়ে বেশি 1এবং চরিত্রের ক্রমের কমপক্ষে একটি পুনরাবৃত্তি থাকতে হবে।

"aa" // true(entirely contains two strings "a")
"aaa" //true(entirely contains three string "a")
"abcabcabc" //true(entirely containas three strings "abc")

"aba" //false(At least there should be two same substrings and nothing more)
"ababa" //false("ab" exists twice but "a" is extra so false)

আমি নীচের ফাংশন তৈরি করেছি:

function check(str){
  if(!(str.length && str.length - 1)) return false;
  let temp = '';
  for(let i = 0;i<=str.length/2;i++){
    temp += str[i]
    //console.log(str.replace(new RegExp(temp,"g"),''))
    if(!str.replace(new RegExp(temp,"g"),'')) return true;
  }
  return false;
}

console.log(check('aa')) //true
console.log(check('aaa')) //true
console.log(check('abcabcabc')) //true
console.log(check('aba')) //false
console.log(check('ababa')) //false

এটি যাচাই করা আসল সমস্যার একটি অংশ। আমি এর মতো একটি অ দক্ষ দক্ষতা বহন করতে পারি না। প্রথমত, এটি স্ট্রিংয়ের অর্ধেকটি লুপ করছে ing

দ্বিতীয় সমস্যাটি হ'ল এটি replace()প্রতিটি লুপে ব্যবহার করছে যা এটি ধীর করে দেয়। পারফরম্যান্স সম্পর্কে আরও ভাল সমাধান আছে?


19
এই লিঙ্কটি আপনার পক্ষে কার্যকর হতে পারে। আমি সবসময় গিগফোরজিক্সকে অ্যালগোরিদম সমস্যার জন্য ভাল উত্স হিসাবে খুঁজে পাই - geeksforgeeks.org/…
Leron_says_get_back_Monica

9
আমি যদি এই ধার নিয়ে থাকে এবং প্রোগ্রামিং গল্ফ এক্সচেঞ্জ সাইটে এটিকে কোডিং চ্যালেঞ্জ হিসাবে তৈরি করি তবে আপনি কি আপত্তি করেন?
এফ্লাক করুন

7
@ouflak আপনি এটি করতে পারেন।
মাহির আলী


24
@ শিডারজ এর জন্য নিউরাল নেটওয়ার্ক ব্যবহার করে কিছুটা মশার গুলি চালানোর জন্য কামান ব্যবহার করার মতো মনে হয়।
জেএডি

উত্তর:


186

এই জাতীয় স্ট্রিং সম্পর্কে একটি নিফটি সামান্য উপপাদ্য রয়েছে।

একটি স্ট্রিং একই প্যাটার্ন নিয়ে একাধিকবার পুনরাবৃত্তি করে এবং যদি স্ট্রিংটি নিজেই কোনও অযৌক্তিক ঘূর্ণন হয়।

এখানে, একটি ঘূর্ণন মানে স্ট্রিংয়ের সামনের অংশ থেকে কয়েকটি সংখ্যক অক্ষর মুছে ফেলা এবং তাদের পিছনে সরানো। উদাহরণস্বরূপ, helloএই স্ট্রিংগুলির কোনও তৈরিতে স্ট্রিংটি ঘোরানো যেতে পারে:

hello (the trivial rotation)
elloh 
llohe 
lohel 
ohell 

এটি কেন কাজ করে তা দেখার জন্য, প্রথমে ধরে নিন যে স্ট্রিংয়ের একটি স্ট্রিং w এর k পুনরাবৃত্তি প্রতিলিপি রয়েছে। তারপরে স্ট্রিংয়ের সামনের দিক থেকে পুনরাবৃত্ত প্যাটার্নের প্রথম কপি (ডাব্লু) মুছে ফেলা এবং এটি পিছনে লাগানো একই স্ট্রিংটি ফিরে আসবে। বিপরীত দিকটি প্রমাণ করার জন্য কিছুটা জটিল, তবে ধারণাটি হ'ল যদি আপনি একটি স্ট্রিং ঘোরান এবং আপনি যেটি শুরু করেছিলেন তা ফিরে পান, আপনি একই প্যাটার্নের একাধিক অনুলিপিগুলির সাথে স্ট্রিং টাইল করতে বারবার সেই ঘূর্ণনটি প্রয়োগ করতে পারেন (সেই প্যাটার্নটি হচ্ছে স্ট্রিংটি আপনাকে ঘোরানোর জন্য শেষ দিকে যেতে হবে)।

এখন প্রশ্ন হল কীভাবে এটি পরীক্ষা করা যায় কিনা। তার জন্য, আমরা ব্যবহার করতে পারি এমন আরও একটি সুন্দর উপপাদ্য রয়েছে:

যদি x এবং y একই দৈর্ঘ্যের স্ট্রিং হয়, তবে x হল y এর একটি আবর্তন যদি হয় এবং কেবল x যদি yy এর একটি স্তর থাকে।

একটি উদাহরণ হিসাবে, আমরা দেখতে পাচ্ছি যে lohelএটি নীচে একটি ঘূর্ণন hello:

hellohello
   ^^^^^

আমাদের ক্ষেত্রে, আমরা জানি যে প্রতিটি স্ট্রিং এক্স সর্বদা xx এর একটি সাবস্ট্রিং হয়ে থাকবে (এটি এক্স এর প্রতিটি অনুলিপিগুলিতে একবারে দুবার প্রদর্শিত হবে)। সুতরাং মূলত আমাদের কেবল আমাদের স্ট্রিং এক্সটি প্রথম বা অর্ধদৈর্ঘ্য চরিত্রের সাথে মেলানোর অনুমতি না দিয়ে xx এর একটি স্ট্রিং কিনা তা পরীক্ষা করে দেখতে হবে। এটির জন্য এখানে একটি ওয়ান-লাইনার রয়েছে:

function check(str) {
    return (str + str).indexOf(str, 1) !== str.length;
}

ধরে indexOfনেওয়া একটি দ্রুত স্ট্রিং মেলানো অ্যালগরিদম ব্যবহার করে প্রয়োগ করা হয়, এটি সময় O (n) এ চলবে, যেখানে এন ইনপুট স্ট্রিংয়ের দৈর্ঘ্য।

আশাকরি এটা সাহায্য করবে!


13
খুব সুন্দর! আমি এটিকে jsLive বেঞ্চমার্ক পৃষ্ঠাতে যুক্ত করেছি ।
ব্যবহারকারী42723

10
@ user42723 দুর্দান্ত! দেখে মনে হচ্ছে এটি সত্যই, সত্যই দ্রুত।
টেম্পলেটটিফিডেফ

5
এফওয়াইআই: আমি এই বাক্যটি বিপরীত না হওয়া পর্যন্ত সেই বাক্যটি বিশ্বাস করতে আমার বেশ কষ্ট হয়েছিল: "একটি স্ট্রিং যদি নিজের মধ্যে একটি অনিয়ন্ত্রিত আবর্তন হয় এবং কেবল যদি একই প্যাটার্নটি একাধিকবার পুনরাবৃত্তি করে তবে"। চিত্রে যান.
অ্যাক্সেল পোহেহেল

11
আপনার কি এই উপপাদ্যগুলির রেফারেন্স রয়েছে?
এইচআরকে 44

4
আমি মনে করি প্রথম বিবৃতিটি " লেমমা ২.৩ এর সমান: x এবং x এর ঘূর্ণন যদি সমান হয় তবে x একটি পুনরাবৃত্তি হয়" doi.org/10.1016/j.tcs.2008.04.020 এ । আরও দেখুন: stackoverflow.com/a/2553533/1462295
BurnsBA

67

আপনি এটি একটি ক্যাপচারিং গ্রুপ এবং ব্যাক রেফারেন্স দ্বারা করতে পারেন । কেবল এটি প্রথম ধরা কৃত মানটির পুনরাবৃত্তি পরীক্ষা করে দেখুন।

function check(str) {
  return /^(.+)\1+$/.test(str)
}

console.log(check('aa')) //true
console.log(check('aaa')) //true
console.log(check('abcabcabc')) //true
console.log(check('aba')) //false
console.log(check('ababa')) //false

উপরের রেজিপ্যাক্সে:

  1. ^এবং অবস্থানটি পূর্বাভাস দেওয়ার $জন্য স্টার্ট ও এন্ড অ্যাঙ্কারস
  2. (.+)যে কোনও প্যাটার্ন ক্যাপচার করে এবং মান (ব্যতীত \n) ক্যাপচার করে ।
  3. \1হ'ল প্রথম ক্যাপচারিত মানের ব্যাকরফারেন্স এবং ক্যাপচারিত মানের \1+পুনরাবৃত্তির জন্য পরীক্ষা করবে।

রেজেক্স ব্যাখ্যা এখানে

RegExp ডিবাগিং ব্যবহারের জন্য: https://regex101.com/r/pqlAuP/1/debugger

পারফরম্যান্স: https://jsperf.com/reegx-and-loop/13


2
এই লাইনটি কী করছে তা আপনি আমাদের ব্যাখ্যা করতে পারেন /^(.+)\1+$/.test(str)
থানভীর শাহ

34
এছাড়াও এই সমাধানের জটিলতা কী? আমি পুরোপুরি নিশ্চিত নই তবে ওপি যেটির চেয়ে দ্রুত গতিযুক্ত বলে মনে হচ্ছে না।
লেরন_সেস_জেট_ব্যাক_মনিকা

8
@ প্রণবসি বালান আমি অ্যালগরিদমে ভাল না, এ কারণেই আমি মন্তব্য বিভাগে লিখি। তবে আমার উল্লেখ করার মতো কয়েকটি বিষয় রয়েছে - ওপিটির ইতিমধ্যে একটি কার্যকরী সমাধান রয়েছে যাতে তিনি এমন একটি অনুরোধ করছেন যা তাকে আরও ভাল পারফরম্যান্স দেবে এবং আপনি কীভাবে সমাধানটি তার চেয়ে বেশি কার্যকর করবে তা আপনি ব্যাখ্যা করেননি। সংক্ষিপ্ত মানে দ্রুত নয়। এছাড়াও, আপনি যে লিঙ্কটি দিয়েছেন তা থেকে: If you use normal (TCS:no backreference, concatenation,alternation,Kleene star) regexp and regexp is already compiled then it's O(n).কিন্তু আপনি যেমন লিখেছেন আপনি পিছনের ব্যবহার করছেন তাই এটি এখনও ও (এন)?
লেরন_সেস_সেট_ব্যাক_ব্যাক_মনিকা

5
আপনি যদি অন্য অক্ষরের মতো একইভাবে নতুন লাইনের অক্ষরগুলির সাথে মেলে প্রয়োজন হয় তার [\s\S]পরিবর্তে আপনি ব্যবহার করতে পারেন .। ডট চরিত্রটি নতুন লাইনের সাথে মেলে না; সমস্ত সাদা-স্থান এবং অ-সাদা স্থানের অক্ষরের জন্য বিকল্প অনুসন্ধানগুলি, যার অর্থ ম্যাচটিতে নিউলাইনগুলি অন্তর্ভুক্ত। (দ্রষ্টব্য যে এটি আরও স্বজ্ঞাততার চেয়ে দ্রুত (.|[\r\n])।) তবে স্ট্রিংটিতে অবশ্যই যদি নতুন লাইনের উপস্থিতি না থাকে তবে সাধারণটি .দ্রুততম হবে। নোট করুন যে ডটল পতাকা কার্যকর করা থাকলে এটি অনেক সহজ হবে ।
হ্যাপিডগ

2
নন /^(.+?)\1+$/একটু দ্রুত? (12 টি পদক্ষেপ বনাম 20 ধাপ)
অনলাইন টমাস

29

সম্ভবত দ্রুততম অ্যালগরিদমিক পদ্ধতি লিনিয়ার সময়ে একটি জেড-ফাংশন তৈরি করছে:

এই স্ট্রিংয়ের জন্য জেড-ফাংশনটি দৈর্ঘ্যের n এর অ্যারে যেখানে i-th উপাদানটি I এর প্রথম অক্ষরের সাথে মিলে যায় এমন অবস্থান i থেকে শুরু হওয়া সর্বাধিক সংখ্যার অক্ষরের সমান।

অন্য কথায়, z [i] হ'ল এস এবং i এর সাথে শুরু হওয়া প্রত্যয়ের মধ্যে দীর্ঘতম সাধারণ উপসর্গের দৈর্ঘ্য।

রেফারেন্সের জন্য সি ++ বাস্তবায়ন:

vector<int> z_function(string s) {
    int n = (int) s.length();
    vector<int> z(n);
    for (int i = 1, l = 0, r = 0; i < n; ++i) {
        if (i <= r)
            z[i] = min (r - i + 1, z[i - l]);
        while (i + z[i] < n && s[z[i]] == s[i + z[i]])
            ++z[i];
        if (i + z[i] - 1 > r)
            l = i, r = i + z[i] - 1;
    }
    return z;
}

জাভাস্ক্রিপ্ট বাস্তবায়ন
যোগ করা অপ্টিমাইজেশন - জেড-অ্যারে এবং প্রারম্ভিক প্রস্থানের অর্ধেক নির্মাণ

function z_function(s) {
  var n = s.length;
  var z = Array(n).fill(0);
  var i, l, r;
  //for our task we need only a half of z-array
  for (i = 1, l = 0, r = 0; i <= n/2; ++i) {
    if (i <= r)
      z[i] = Math.min(r - i + 1, z[i - l]);
    while (i + z[i] < n && s[z[i]] == s[i + z[i]])
      ++z[i];

      //we can check condition and return here
     if (z[i] + i === n && n % i === 0) return true;
    
    if (i + z[i] - 1 > r)
      l = i, r = i + z[i] - 1;
  }
  return false; 
  //return z.some((zi, i) => (i + zi) === n && n % i === 0);
}
console.log(z_function("abacabacabac"));
console.log(z_function("abcab"));

তারপরে আপনাকে সূচকগুলি পরীক্ষা করতে হবে iযা n কে ভাগ করে। আপনি এই ধরনের খুঁজে পান, তাহলে iযে i+z[i]=nতারপর স্ট্রিং sদৈর্ঘ্য সংকুচিত করা যেতে পারে iএবং আপনি আসতে পারেন true

উদাহরণস্বরূপ, জন্য

string s= 'abacabacabac'  with length n=12`

z-অ্যারে হয়

(0, 0, 1, 0, 8, 0, 1, 0, 4, 0, 1, 0)

এবং আমরা এটি পেতে পারি

i=4
i+z[i] = 4 + 8 = 12 = n
and
n % i = 12 % 4 = 0`

সুতরাং s3 বার পুনরাবৃত্তি দৈর্ঘ্যের স্তর হিসাবে উপস্থাপিত হতে পারে।


3
return z.some((zi, i) => (i + zi) === n && n % i === 0)
প্রণব সি বালান

2
সালমান এ এবং প্রণব সি বালান
এমবিও

1
অতিরিক্ত পুনরাবৃত্তি এড়িয়ে বিকল্প পদ্ধতিconst check = (s) => { let n = s.length; let z = Array(n).fill(0); for (let i = 1, l = 0, r = 0; i < n; ++i) { if (i <= r) z[i] = Math.min(r - i + 1, z[i - l]); while (i + z[i] < n && s[z[i]] == s[i + z[i]]) ++z[i]; // check condition here and return if (z[i] + i === n && n % i === 0) return true; if (i + z[i] - 1 > r) l = i, r = i + z[i] - 1; } // or return false return false; }
প্রণব সি বালান

2
জেড-ফাংশনটি ব্যবহার করা একটি ভাল ধারণা, তবে এটি 'তথ্য-ভারী', এতে প্রচুর পরিমাণে তথ্য থাকে যা কখনই ব্যবহৃত হয় না।
অ্যাক্সেল পোহেহেল

@ অ্যাক্সেল পোদহেল তবুও, এটি ও (এন) সময়ে স্ট্রিংয়ের আচরণ করে (প্রতিটি চর সর্বাধিক দুইবার ব্যবহৃত হয়)। যাইহোক, আমাদের অবশ্যই প্রত্যেকটি চরটি পরীক্ষা করতে হবে, সুতরাং তাত্ত্বিকভাবে দ্রুততর অ্যালগরিদম নেই (যদিও অন্তর্নির্মিত পদ্ধতিগুলি অপেক্ষাকৃত অনুকূল হতে পারে)। এছাড়াও শেষ সম্পাদনায় আমি স্ট্রিং দৈর্ঘ্যের 1/2 দ্বারা গণনা সীমাবদ্ধ করি।
এমবিও

23

আমি gnasher729 এর উত্তর পড়েছি এবং এটি প্রয়োগ করেছি। ধারণাটি হ'ল যদি কোনও পুনরাবৃত্তি হয়, তবে অবশ্যই অবশ্যই পুনরাবৃত্তিগুলির একটি প্রধান সংখ্যা থাকতে হবে।

function* primeFactors (n) {
    for (var k = 2; k*k <= n; k++) {
        if (n % k == 0) {
            yield k
            do {n /= k} while (n % k == 0)
        }
    }
    if (n > 1) yield n
}

function check (str) {
    var n = str.length
    primeloop:
    for (var p of primeFactors(n)) {
        var l = n/p
        var s = str.substring(0, l)
        for (var j=1; j<p; j++) {
            if (s != str.substring(l*j, l*(j+1))) continue primeloop
        }
        return true
    }
    return false
}

কিছুটা আলাদা অ্যালগোরিদম হ'ল:

function check (str) {
    var n = str.length
    for (var p of primeFactors(n)) {
        var l = n/p
        if (str.substring(0, n-l) == str.substring(l)) return true
    }
    return false
}

আমি jsLive পৃষ্ঠা আপডেট করেছি যা এই পৃষ্ঠায় ব্যবহৃত অ্যালগরিদম ধারণ করে।


এটি সত্যিই দ্রুত বলে মনে হচ্ছে যেহেতু এটি অপ্রয়োজনীয় চেকগুলি এড়িয়ে চলে।
প্রণব সি বালান

1
খুব সুন্দর, কেবলমাত্র আমি মনে করি যে প্রথম অক্ষরটি সাবস্ট্রিং কল করার আগে নির্দিষ্ট জায়গায় পুনরায় প্রত্যাবর্তন করবে।
বেন ভয়েগট

function*আমার মতো প্রথমবারের মতো লোকেরা হোঁচট খাচ্ছে , এটি কোনও জেনারেটর ঘোষণার জন্য, কোনও নিয়মিত কাজ নয়। দেখুন MDN
জুলিয়েন বিক্ষুব্ধ করা

17

ধরুন স্ট্রিংয়ের S এর দৈর্ঘ্য N রয়েছে এবং এটি স্ট্রিংয়ের নকল দিয়ে তৈরি হয়েছে, তার পরে s এর দৈর্ঘ্য N কে ভাগ করে দেয়। উদাহরণস্বরূপ, যদি এস এর দৈর্ঘ্য 15 হয়, তবে স্ট্রিংয়ের দৈর্ঘ্য 1, 3 বা 5 হয়।

এস এর s এর (পি * কিউ) কপি তৈরি করা যাক। তারপরে এস পি এর (কপি, পুনরাবৃত্তি বার বার) কপিও তৈরি করা হয়। আমাদের দুটি ক্ষেত্রে আছে: যদি এন প্রাইম হয় বা 1, তবে এস কেবলমাত্র দৈর্ঘ্যের 1 টি স্ট্রিংয়ের অনুলিপিগুলি থেকে তৈরি করা যেতে পারে N N যদি সংমিশ্রিত হয়, তবে আমাদের কেবল প্রাইম পি বিভাজনের জন্য N / p দৈর্ঘ্যের সাবস্ট্রিংগুলি পরীক্ষা করতে হবে এস এর দৈর্ঘ্য

সুতরাং এন = এস এর দৈর্ঘ্য নির্ধারণ করুন, তারপরে ও (স্কয়ার্ট (এন)) এর সমস্ত মূল কারণগুলি সন্ধান করুন। যদি কেবল একটি ফ্যাক্টর এন থাকে তবে এস একই স্ট্রিং N এর পুনরাবৃত্তি হয়েছে কিনা তা যাচাই করুন, অন্যথায় প্রতিটি প্রাইম ফ্যাক্টর পি এর জন্য, এসটি প্রথম এন / পি অক্ষরের পি পুনরাবৃত্তি রয়েছে কিনা তা পরীক্ষা করে দেখুন।


আমি অন্যান্য সমাধানগুলি পরীক্ষা করে দেখিনি, তবে এটি খুব দ্রুত বলে মনে হচ্ছে। আপনি যদি "শুধুমাত্র একটি ফ্যাক্টর এন থাকে তবে চেক করুন ..., অন্যথায়" সরলতার জন্য অংশটি ছেড়ে দিতে পারেন, কারণ এটি কোনও বিশেষ ক্ষেত্রে নয়। জাভাস্ক্রিপ্ট বাস্তবায়ন দেখে ভাল লাগবে যা অন্যান্য বাস্তবায়নের পাশে jspu এ চালানো যেতে পারে।
ব্যবহারকারী42723

1
আমি এখন এটি আমার উত্তরে
user42723

10

আমি মনে করি একটি পুনরাবৃত্ত ফাংশনটি খুব দ্রুত হতে পারে। প্রথম পর্যবেক্ষণটি হল সর্বাধিক পুনরাবৃত্ত প্যাটার্ন দৈর্ঘ্য মোট স্ট্রিংয়ের অর্ধেক দীর্ঘ long এবং আমরা কেবল সমস্ত সম্ভাব্য পুনরাবৃত্ত প্যাটার্ন দৈর্ঘ্য পরীক্ষা করতে পারি: 1, 2, 3, ..., স্ট্রাইলথ লেন্থ / 2

পুনরাবৃত্তি ফাংশন হ'ল পুনরাবৃত্তি (পি, স্ট্র) পরীক্ষা যদি এই প্যাটার্নটি স্ট্রিতে পুনরাবৃত্তি করা হয়।

যদি স্ট্রিংটি প্যাটার্নের চেয়ে দীর্ঘ হয় তবে পুনরাবৃত্তির প্রথম অংশ (পি হিসাবে একই দৈর্ঘ্য) এর পুনরাবৃত্তি হওয়ার পাশাপাশি স্ট্রের বাকী অংশের প্রয়োজন হয়। সুতরাং str কার্যকরভাবে দৈর্ঘ্যের p.leight এর টুকরো টুকরো হয়ে গেছে।

যদি পরীক্ষিত প্যাটার্ন এবং স্ট্রিং সমান আকারের হয় তবে পুনরাবৃত্তি এখানে, সফলভাবে শেষ হয়।

দৈর্ঘ্য যদি পৃথক হয় ("আবা" এবং প্যাটার্ন "আব" এর জন্য ঘটে) বা যদি টুকরাগুলি আলাদা হয় তবে মিথ্যাটি ফিরে আসবে এবং পুনরাবৃত্তি প্রচার করবে ating

function check(str)
{
  if( str.length==1 ) return true; // trivial case
  for( var i=1;i<=str.length/2;i++ ) { // biggest possible repeated pattern has length/2 characters

    if( str.length%i!=0 ) continue; // pattern of size i doesn't fit
    
    var p = str.substring(0, i);
    if( isRepeating(p,str) ) return true;
  }
  return false;
}


function isRepeating(p, str)
{
  if( str.length>p.length ) { // maybe more than 2 occurences

    var left = str.substring(0,p.length);
    var right = str.substring(p.length, str.length);
    return left===p && isRepeating(p,right);
  }
  return str===p; 
}

console.log(check('aa')) //true
console.log(check('aaa')) //true 
console.log(check('abcabcabc')) //true
console.log(check('aba')) //false
console.log(check('ababa')) //false

পারফরম্যান্স: https://jsperf.com/reegx-and-loop/13


1
if( str===p.repeat(str.length/i) ) return true;পুনরাবৃত্তি ফাংশনটি ব্যবহার না করে চেক করা কি দ্রুত হবে ?
ক্রোনোকিডাল

1
Jsperf টেস্টগুলিতে কনসোল.লগগুলি রাখবেন না, গ্লোবাল বিভাগের ভিতরে ফাংশন প্রস্তুত করুন, গ্লোবাল বিভাগে টেস্ট স্ট্রিংও প্রস্তুত করুন (দুঃখিত, জেএসপিফার সম্পাদনা করতে পারবেন না)
সালমান

@ সালমান - ভাল পয়েন্ট আমি আমার পূর্বসূরীর (প্রণব সি) থেকে সবেমাত্র jsperf পরিবর্তন করেছি, প্রথমবার আমি jsperf, শীতল সরঞ্জামটি ব্যবহার করেছি।
এক্সেল পোডহেল

@ সালমানা: আপডেট হয়েছে: jsperf.com/regex-and-loop/1 ... তথ্যের জন্য ধন্যবাদ ... এমনকি আমি এর সাথে পরিচিত নই (জাসস্পারফ) ​​... তথ্যের জন্য ধন্যবাদ
প্রণব সি বালান

হাই সালমান, jsperf.com/reegx- এবং- লুপ 10- এর জন্য অনেক ধন্যবাদ - হ্যাঁ, নতুন পারফেক্ট পরীক্ষাটি আরও বেশি অর্থবোধ করে। ফাংশনগুলির সেটআপটি প্রস্তুতি কোডের মধ্যে যাওয়া উচিত।
অ্যাক্সেল পোহেহেল

7

পাইথনে এটি লিখেছেন। আমি জানি এটি প্ল্যাটফর্ম নয়, তবে এটি 30 মিনিট সময় নিয়েছে। পিএস => পাইথন

def checkString(string):
    gap = 1 
    index= 0
    while index < len(string)/2:
        value  = [string[i:i+gap] for i in range(0,len(string),gap) ]

        x = [string[:gap]==eachVal for eachVal in value]

        if all(x):
            print("THEY ARE  EQUAL")
            break 

        gap = gap+1
        index= index+1 

checkString("aaeaaeaaeaae")

6

আমার দৃষ্টিভঙ্গি gnasher729 এর অনুরূপ, এটি সাবস্ট্রিংয়ের সম্ভাব্য দৈর্ঘ্যটিকে প্রধান ফোকাস হিসাবে ব্যবহার করে তবে এটি কম ম্যাথ-ওয়াই এবং প্রক্রিয়া নিবিড়:

এল: মূল স্ট্রিংয়ের দৈর্ঘ্য

এস: বৈধ সাব-স্ট্রিংগুলির সম্ভাব্য দৈর্ঘ্য

এল / 2 থেকে 1 এর লুপ এস (এর পূর্ণসংখ্যার অংশ) 1। এল / এস যদি একটি পূর্ণসংখ্যা হয় তবে আপনার মূল স্ট্রিংটি মূল স্ট্রিংয়ের মুষ্টির এস অক্ষরগুলির বিপরীতে এল / এস বারবার পুনরাবৃত্তি করে দেখুন।

এল / 2 থেকে পিছন দিকে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছনে পিছন দিকের কারণটি 1 থেকে নয় is আপনি যদি চান ছোট থেকে ছোট সাবস্ট্রিং লুপটি 1 থেকে এল / 2 তে যান। উদাহরণ: "আবাববাব" এর "আব" এবং "আবাব" উভয়ই সম্ভাব্য সাবস্ট্রিং হিসাবে রয়েছে। দু'জনের মধ্যে কোনটি দ্রুত হবে যদি আপনি কেবল সত্য / মিথ্যা ফলাফলের বিষয়ে চিন্তা করেন তবে এটি প্রয়োগ করা হবে তার স্ট্রিং / সাবস্ট্রিংয়ের ধরণের উপর নির্ভর করে।


5

তালিকাটি অন্তত একবারে পুনরাবৃত্তি করা হলে নিম্নলিখিত গণিতের কোডটি প্রায় সনাক্ত করে। যদি স্ট্রিংটি অন্তত একবার পুনরাবৃত্তি হয় তবে এটি সত্য হয়, তবে স্ট্রিংটি পুনরাবৃত্ত স্ট্রিংগুলির রৈখিক সংমিশ্রণ হলে এটি সত্যও হতে পারে।

IsRepeatedQ[list_] := Module[{n = Length@list},
   Round@N@Sum[list[[i]] Exp[2 Pi I i/n], {i, n}] == 0
];

এই কোডটি "পূর্ণদৈর্ঘ্য" অবদানের সন্ধান করে, যা অবশ্যই পুনরাবৃত্ত স্ট্রিংয়ের শূন্য হওয়া উচিত, তবে স্ট্রিংটিকেও accbbdপুনরাবৃত্তি হিসাবে বিবেচনা করা হয়, কারণ এটি দুটি পুনরাবৃত্ত স্ট্রিংগুলির যোগফল abababএবং 012012

ধারণাটি হ'ল ফাস্ট ফুরিয়ার ট্রান্সফর্ম ব্যবহার করা এবং ফ্রিকোয়েন্সি বর্ণালীটি সন্ধান করা। অন্যান্য ফ্রিকোয়েন্সি দেখে, একজনকেও এই অদ্ভুত দৃশ্যটি সনাক্ত করতে সক্ষম হওয়া উচিত।


4

এখানে মূল ধারণাটি হ'ল যে কোনও সম্ভাব্য সাবস্ট্রিং পরীক্ষা করা, 1 দৈর্ঘ্য থেকে শুরু হওয়া এবং মূল স্ট্রিংয়ের দৈর্ঘ্যের অর্ধেক স্থানে থামানো। আমরা কেবলমাত্র স্ট্রিংয়ের দৈর্ঘ্যের দিকে লক্ষ্য করি যা মূল স্ট্রিংয়ের দৈর্ঘ্যকে সমানভাবে ভাগ করে দেয় (অর্থাত্ স্ট্রিংলেন্থ% সাবস্ট্রিংএলেনথ == 0)।

এই বাস্তবায়নটি দ্বিতীয় অক্ষরে যাওয়ার আগে প্রতিটি সম্ভাব্য সাবস্ট্রিং পুনরাবৃত্তির প্রথম চরিত্রটি দেখায়, যা সাবস্ট্রিংগুলি দীর্ঘ হওয়ার আশা করা হলে সময় সাশ্রয় করতে পারে। পুরো সাবস্ট্রিং পরীক্ষা করার পরে যদি কোনও মিল খুঁজে পাওয়া যায় না, তবে আমরা সত্যটিতে ফিরে আসি।

সম্ভাব্য সাবস্ট্রিংগুলি পরীক্ষা করার জন্য শেষ হয়ে গেলে আমরা মিথ্যা প্রত্যাবর্তন করি।

function check(str) {
  const len = str.length;
  for (let subl = 1; subl <= len/2; ++subl) {
    if ((len % subl != 0) || str[0] != str[subl])
      continue;
    
    let i = 1;
    for (; i < subl; ++i)
    {
      let j = 0;
      for (; j < len; j += subl)
        if (str[i] != str[j + i])
          break;
      if (j != len)
        break;
    }
    
    if (i == subl)
      return true;
  }
  return false;
}

console.log(check('aa')) //true
console.log(check('aaa')) //true
console.log(check('abcabcabc')) //true
console.log(check('aba')) //false
console.log(check('ababa')) //false


-1

আমি জাভাস্ক্রিপ্টের সাথে পরিচিত নই, সুতরাং আমি জানি না এটি কত দ্রুত হতে চলেছে, তবে এখানে কেবল বিল্টইনগুলি ব্যবহার করে একটি রৈখিক সময় সমাধান (যুক্তিসঙ্গত বিল্টিন বাস্তবায়ন অনুমান) করা হচ্ছে। সিউডোকোডে আমি অ্যালগরিদম বর্ণনা করব।

function check(str) {
    t = str + str;
    find all overlapping occurrences of str in t;
    for each occurrence at position i
        if (i > 0 && i < str.length && str.length % i == 0)
            return true;  // str is a repetition of its first i characters
    return false;
}

ধারণাটি এমবিওর উত্তরের অনুরূপ। iদৈর্ঘ্যকে বিভাজনকারী প্রত্যেকের strজন্য এটির প্রথম iঅক্ষরগুলির পুনরাবৃত্তি হ'ল এবং কেবলমাত্র যদি iঅক্ষর স্থানান্তরিত হওয়ার পরে একই থাকে ।

আমার মনে আসে যে এ জাতীয় বিল্টিন অনুপলব্ধ বা অকার্যকর হতে পারে। এই ক্ষেত্রে, কেএমপি অ্যালগরিদমটি ম্যানুয়ালি প্রয়োগ করা সর্বদা সম্ভব , যা এমবোর উত্তরে অ্যালগরিদমের মতো কোডের সমান পরিমাণ নেয়।


ওপি পুনরাবৃত্তি রয়েছে কিনা তা জানতে চায় । আপনার ক্রিয়াকলাপের (দ্বিতীয় অংশের) দ্বিতীয় রেখাটি পুনরাবৃত্তির সংখ্যা গণনা করে - এটি সেই বিট যা ব্যাখ্যা করা দরকার। উদাহরণস্বরূপ "abcabcabc" এর "এবিসি" এর 3 পুনরাবৃত্তি রয়েছে, তবে আপনার দ্বিতীয় লাইনের কোনও পুনরাবৃত্তি ছিল কিনা তা কীভাবে কার্যকর হয়েছিল?
লরেন্স

@ লরেন্স আমি আপনার প্রশ্নটি বুঝতে পারি না। এই অ্যালগরিদম ধারণা যে স্ট্রিং যদি এবং কেবল তার দৈর্ঘ্য কিছু ভাজক জন্য যদি তার সাবস্ট্রিং একটি পুনরাবৃত্তি হয় উপর ভিত্তি করে তৈরি i, s[0:n-i] == s[i:n]অথবা equivalently, s == s[i:n] + s[0:i]। দ্বিতীয় লাইনে এর কোনও পুনরাবৃত্তি ছিল কিনা তা কেন কাজ করা দরকার?
infmagic2047

আমি আপনার অ্যালগরিদম বুঝতে পারি কিনা তা আমাকে দেখতে দিন। প্রথমে strআপনি নিজেকে গঠনের জন্য সংযোজন করুন t, তারপরে ভিতরে সন্ধানের জন্য স্ক্যান tকরুন । ঠিক আছে, এটি কাজ করতে পারে (আমি আমার ডাউনটোটকে প্রত্যাহার করেছি)। যদিও এটি স্ট্রেন (স্ট্র) এ রৈখিক নয়। বলুন দৈর্ঘ্যের এল। তারপরে প্রতিটি পজিশনে p = 0,1,2, ..., str [0..L-1] == t [p..p + L-1] O (L) লাগে কিনা তা পরীক্ষা করে দেখুন ) সময়। পি এর মানগুলি অতিক্রম করার সাথে সাথে আপনাকে ও (এল) চেকগুলি করা দরকার, সুতরাং এটি ও (এল ^ 2)। strtstr
লরেন্স

-10

একটি সহজ ধারণা হ'ল স্ট্রিংটি "" এর সাবস্ট্রিংয়ের সাথে প্রতিস্থাপন করা এবং যদি কোনও পাঠ্য বিদ্যমান থাকে তবে এটি মিথ্যা, অন্যথায় এটি সত্য।

'ababababa'.replace(/ab/gi,'')
"a" // return false
'abababab'.replace(/ab/gi,'')
 ""// return true


হ্যাঁ, এবিসি বা ইউনিকর্নের জন্য ব্যবহারকারীরা / এবিসি / বা / ইউনিকর্ন / দিয়ে চেক করবেন না, দুঃখিত যদি আমি আপনার প্রসঙ্গটি মিস করছি
বিনোদ কুমার জি

3
প্রশ্নটি আরও পরিষ্কার হতে পারে, তবে স্ট্রিংটি সম্পূর্ণরূপে অন্য কোনও স্ট্রিংয়ের 2 বা ততোধিক পুনরাবৃত্তি দ্বারা গঠিত কিনা তা সিদ্ধান্ত নেওয়ার উপায় এটি যা জিজ্ঞাসা করছে। এটি একটি নির্দিষ্ট সাবস্ট্রিং অনুসন্ধান করছে না।
হ্যাপিডগ

2
আমি প্রশ্নের সাথে কিছু স্পষ্টতা যুক্ত করেছি, যা এটি এখন আরও স্পষ্ট করা উচিত।
হ্যাপিডগ

@ ভিনোদ আপনি যদি ইতিমধ্যে রেজেক্স ব্যবহার করতে চান তবে আপনার ম্যাচটি নোঙ্গর করা উচিত এবং পরীক্ষাটি ব্যবহার করা উচিত। কেবল কিছু শর্ত বৈধ করার জন্য স্ট্রিংটি সংশোধন করার কোনও কারণ নেই।
মেরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.